Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle Select Max Date für mehrere Datensätze

Ich denke, Sie müssen hinzufügen ...

AND outside.asset_tag=inside.asset_tag

...zu den Kriterien in Ihrem ON Liste.

Auch ein RIGHT OUTER JOIN wird nicht benötigt. Ein INNER JOIN liefert die gleichen Ergebnisse (und ist möglicherweise effizienter), da es keine Kombinationen von asset_tag geben wird und last_read_date in der Unterabfrage, die in mp_vehicle_asset_profile nicht vorhanden sind .

Selbst dann kann die Abfrage mehr als eine Zeile pro Asset-Tag zurückgeben, wenn es „Krawatten“ gibt – d. h. mehrere Zeilen mit demselben last_read_date . Im Gegensatz dazu wird die analysebasierte Antwort von @Lamak in dieser Situation willkürlich genau eine Zeile auswählen.

Ihr Kommentar schlägt vor, dass Sie Bindungen aufheben möchten, indem Sie die Zeile mit dem höchsten mtr_reading auswählen für das last_read_date .

Sie können die analysebasierte Antwort von @Lamak ändern, indem Sie den ORDER BY ändern im OVER Klausel zu:

ORDER BY last_read_date DESC, mtr_reading DESC

Wenn es immer noch Bindungen gibt (d. h. mehrere Zeilen mit demselben asset_tag , last_read_date , und mtr_reading ), wird die Abfrage wieder willkürlich genau eine Zeile auswählen.

Sie könnten meine aggregierte Antwort ändern, um Krawatten mit dem höchsten mtr_reading zu brechen wie folgt:

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

Wenn es immer noch Bindungen gibt (d. h. mehrere Zeilen mit demselben asset_tag , last_read_date , und mtr_reading ), kann die Abfrage wieder mehr als eine Zeile zurückgeben.

Eine andere Art, in der sich die analytischen und aggregierten Antworten unterscheiden, ist die Behandlung von Nullen. Falls eines von asset_tag , last_read_date , oder mtr_reading null sind, gibt die analysebasierte Antwort verwandte Zeilen zurück, die aggregierte jedoch nicht (da die Gleichheitsbedingungen im Join nicht zu TRUE ausgewertet werden wenn eine Null beteiligt ist.