sql >> Base de Datos >  >> RDS >> Oracle

Oracle Select Max Date en múltiples registros

Creo que necesitas agregar...

AND outside.asset_tag=inside.asset_tag

...a los criterios de su ON lista.

También una RIGHT OUTER JOIN no es necesario. Una INNER JOIN dará los mismos resultados (y puede ser más eficiente), ya que no habrá combinaciones de asset_tag y last_read_date en la subconsulta que no existe en mp_vehicle_asset_profile .

Incluso entonces, la consulta puede devolver más de una fila por etiqueta de recurso si hay "empates", es decir, varias filas con la misma last_read_date . Por el contrario, la respuesta basada en análisis de @Lamak elegirá arbitrariamente exactamente una fila de esta situación.

Su comentario sugiere que desea desempatar eligiendo la fila con mayor mtr_reading para la last_read_date .

Puede modificar la respuesta basada en análisis de @Lamak para hacer esto cambiando ORDER BY en el OVER cláusula a:

ORDER BY last_read_date DESC, mtr_reading DESC

Si todavía hay vínculos (es decir, varias filas con el mismo asset_tag , last_read_date y mtr_reading ), la consulta volverá a seleccionar automáticamente exactamente una fila.

Podría modificar mi respuesta basada en agregados para romper empates usando la mtr_reading más alta de la siguiente manera:

SELECT  
    outside.asset_tag, 
    outside.description,
    outside.asset_type,
    outside.asset_group,
    outside.status_code,
    outside.license_no,
    outside.rentable_yn,
    outside.manufacture_code,
    outside.model,
    outside.manufacture_vin,
    outside.vehicle_yr,
    outside.meter_id,
    outside.mtr_uom,
    outside.mtr_reading,
    outside.last_read_date 
FROM 
    mp_vehicle_asset_profile outside 
    INNER JOIN 
    ( 
        SELECT
            asset_tag, 
            MAX(last_read_date) AS last_read_date,
            MAX(mtr_reading) KEEP (DENSE_RANK FIRST ORDER BY last_read_date DESC) AS mtr_reading
        FROM
            mp_vehicle_asset_profile 
        GROUP BY
            asset_tag 
    ) inside 
    ON 
        outside.asset_tag = inside.asset_tag
        AND
        outside.last_read_date = inside.last_read_date
        AND
        outside.mtr_reading = inside.mtr_reading

Si todavía hay vínculos (es decir, varias filas con el mismo asset_tag , last_read_date y mtr_reading ), la consulta puede volver a devolver más de una fila.

Otra forma en que difieren las respuestas analíticas y las basadas en agregados es en el tratamiento de los valores nulos. Si alguno de asset_tag , last_read_date , o mtr_reading son nulos, la respuesta basada en análisis devolverá filas relacionadas, pero la respuesta basada en agregados no lo hará (porque las condiciones de igualdad en la unión no se evalúan como TRUE cuando se trata de un valor nulo.