Pregunta

Suponiendo una mesa CAR con dos columnas CAR_ID (int) y VERSION (int).

Quiero recuperar la versión máxima de cada automóvil.

Entonces hay dos soluciones (al menos):

select car_id, max(version) as max_version 
  from car  
 group by car_id;

O :

select car_id, max_version 
  from  ( select car_id, version
               , max(version) over (partition by car_id) as max_version
            from car
                ) max_ver  
 where max_ver.version = max_ver.max_version

¿Son estas dos consultas de manera similar?

¿Fue útil?

Solución

Si puede afectar

La segunda consulta es un ejemplo de vista en línea. Es un método muy útil para realizar informes con varios tipos de recuentos o el uso de cualquier función agregada con él.

Oracle ejecuta la subconsulta y luego usa las filas resultantes como una vista en la cláusula FOT.

Como consideramos sobre el rendimiento, siempre recomiendo la vista en línea en lugar de elegir otro tipo de subconsulta.

Y una segunda consulta más dará todos los registros máximos, mientras que el primero le dará solo un registro máximo.

mira aquí

Otros consejos

Sé que esto es extremadamente viejo, pero pensé que debería ser señalado.

select car_id, max_version 
  from (select car_id
             , version
             , max(version) over (partition by car_id) as max_version
          from car ) max_ver  
 where max_ver.version = max_ver.max_version

No estoy seguro de por qué hizo la opción dos así ... en este caso, la Sub Select debe ser teóricamente más lenta porque la selección de la misma Tabla 2x y luego uniendo los resultados de nuevo a sí mismo.

Simplemente elimine la versión de su vista en línea y son lo mismo.

select car_id, max(version) over (partition by car_id) as max_version
  from car

El rendimiento realmente depende del optimizador en esta situación, pero sí, como la respuesta original sugiere opiniones en línea, ya que hacen resultados estrechos. Aunque este no es un buen ejemplo, es la misma tabla sin filtros en las selecciones dadas.

La partición también es útil cuando selecciona muchas columnas pero necesita diferentes agregaciones que se ajusten al conjunto de resultados. De lo contrario, se ve obligado a agrupar por cualquier otra columna.

Dependerá de su esquema de indexación y la cantidad de datos en la tabla. El optimizador probablemente tomará diferentes decisiones basadas en los datos que realmente están dentro de la tabla.

He descubierto, al menos en SQL Server (sé que preguntó sobre Oracle) que es más probable que el optimizador realice un escaneo completo con la partición por consulta frente al grupo por consulta. Pero eso es solo en los casos en que tiene un índice que contiene CAR_ID y la versión (DESC) en él.

La moraleja de la historia es que probaría a fondo para elegir el correcto. Para mesas pequeñas, no importa. Para conjuntos de datos realmente, en realidad, ninguno puede ser rápido ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top