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

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

Así que hay dos soluciones de (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 del mismo modo eficiente?

OriginalEl autor Mik378 | 2012-02-17

3 Comentarios

  1. 2

    Sí afecta

    Segunda consulta es un ejemplo de la Vista en línea.
    Es un método muy útil para la realización de los informes de los diferentes tipos de cuenta o el uso de cualquiera de las funciones de agregado con ella.

    Oracle ejecuta la subconsulta y, a continuación, utiliza las filas resultantes como una vista en la cláusula FROM.

    Como nos cuenta sobre el rendimiento , siempre recomendamos vista en línea en lugar de elegir otra subconsulta tipo.

    Y una cosa más con la segunda consulta dará a todos los registros máximos,mientras que el primero le dará sólo un max de registro.

    ver aquí

    «Y una cosa más con la segunda consulta dará a todos los registros máximos,mientras que el primero le dará sólo un max de registro». No entiendo por qué usted escribió que la primera columna devuelve sólo un máx. Las dos consultas devuelven los mismos resultados

    OriginalEl autor Java

  2. 3

    Sé que esto es muy antiguo, 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 sé por qué se hizo la opción dos, como que… en este caso la sub seleccione debería ser teóricamente más lento debido a su selección en la misma mesa, 2x y, a continuación, combinar los resultados de vuelta a sí mismo.

    Acaba de quitar la versión de su vista en línea y que son la misma cosa.

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

    El rendimiento depende en realidad del optimizador en esta situación, pero sí como respuesta original sugiere en línea puntos de vista como lo hacen reducir los resultados. Aunque este no es un buen ejemplo de ser de la misma tabla sin filtros en las selecciones dado.

    De partición también es útil cuando usted está seleccionando a una gran cantidad de columnas, pero necesitan diferentes agregaciones que se ajuste el conjunto de resultados. De lo contrario, usted está obligado a grupo en cada columna.

    OriginalEl autor JustDave

  3. 2

    Dependerá de su índice de esquema y la cantidad de datos en la tabla. El optimizador es probable que tomar diferentes decisiones basadas en los datos que la realidad dentro de la tabla.

    He encontrado, al menos en SQL Server (yo sé que a ustedes les preguntó acerca de Oracle) que el optimizador es más probable que se realice un análisis completo con la PARTICIÓN de consulta vs el GRUPO de consulta. Pero eso es sólo en los casos donde se tiene un índice de lo que contiene CAR_ID y la VERSIÓN (DESC) en ella.

    La moraleja de la historia es que me gustaría probar a fondo el derecho de elegir uno. Para tablas pequeñas, no importa. Para que realmente, realmente grandes conjuntos de datos, ni puede ser rápido…

    OriginalEl autor Dave Markle

Dejar respuesta

Please enter your comment!
Please enter your name here