Oracle
 sql >> Database >  >> RDS >> Oracle

Oracle Seleziona la data massima su più record

Penso che tu debba aggiungere...

AND outside.asset_tag=inside.asset_tag

...ai criteri nel tuo ON elenco.

Anche un RIGHT OUTER JOIN non è necessario. Un INNER JOIN darà gli stessi risultati (e potrebbe essere più efficiente), poiché non ci saranno combinazioni di asset_tag e last_read_date nella sottoquery che non esiste in mp_vehicle_asset_profile .

Anche in questo caso, la query può restituire più di una riga per tag asset se sono presenti "legami", ovvero più righe con lo stesso last_read_date . Al contrario, la risposta analitica di @Lamak sceglierà arbitrariamente esattamente una riga in questa situazione.

Il tuo commento suggerisce che vuoi rompere i legami selezionando la riga con il mtr_reading più alto per il last_read_date .

Puoi modificare la risposta analitica di @Lamak per farlo cambiando il ORDER BY nel OVER clausola a:

ORDER BY last_read_date DESC, mtr_reading DESC

Se ci sono ancora pareggi (ovvero, più righe con lo stesso asset_tag , last_read_date e mtr_reading ), la query selezionerà nuovamente in modo arbitrario esattamente una riga.

Puoi modificare la mia risposta basata su aggregati per rompere i legami usando il massimo mtr_reading come segue:

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

Se ci sono ancora pareggi (ovvero, più righe con lo stesso asset_tag , last_read_date e mtr_reading ), la query potrebbe restituire di nuovo più di una riga.

Un altro modo in cui le risposte analitiche e aggregate differiscono è nel trattamento dei valori nulli. Se uno qualsiasi di asset_tag , last_read_date o mtr_reading sono nulli, la risposta basata sull'analitica restituirà le righe correlate, ma quella basata sull'aggregato no (perché le condizioni di uguaglianza nel join non restituiscono TRUE quando è coinvolto un null.