sql >> Databasteknik >  >> RDS >> Oracle

Oracle Välj maxdatum på flera poster

Jag tror att du måste lägga till...

AND outside.asset_tag=inside.asset_tag

...till kriterierna i din ON lista.

Även en RIGHT OUTER JOIN behövs inte. En INNER JOIN kommer att ge samma resultat (och kan vara mer effektiva), eftersom det inte kommer att finnas kombinationer av asset_tag och last_read_date i underfrågan som inte finns i mp_vehicle_asset_profile .

Även då kan frågan returnera mer än en rad per tillgångstagg om det finns "band" -- det vill säga flera rader med samma last_read_date . Däremot kommer @Lamaks analytiska svar godtyckligt att välja exakt en rad i denna situation.

Din kommentar antyder att du vill bryta banden genom att välja raden med högst mtr_reading för last_read_date .

Du kan ändra @Lamaks analysbaserade svar för att göra detta genom att ändra ORDER BY i OVER klausul till:

ORDER BY last_read_date DESC, mtr_reading DESC

Om det fortfarande finns kopplingar (det vill säga flera rader med samma asset_tag , last_read_date och mtr_reading ), kommer frågan återigen abortärt välja exakt en rad.

Du kan ändra mitt aggregatbaserade svar för att bryta band med högsta mtr_reading enligt följande:

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

Om det fortfarande finns kopplingar (det vill säga flera rader med samma asset_tag , last_read_date och mtr_reading ), kan frågan återigen returnera mer än en rad.

Ett annat sätt att de analytiska och aggregatbaserade svaren skiljer sig åt är i deras behandling av nollor. Om någon av asset_tag , last_read_date , eller mtr_reading är null, kommer det analytiskt baserade svaret att returnera relaterade rader, men det aggregatbaserade svaret kommer inte att returnera det (eftersom likhetsvillkoren i kopplingen inte utvärderas till TRUE när en noll är inblandad.



  1. CONTAINS fungerar inte med Oracle Text

  2. Postgresql :Lägg till element i json-arrayobjekt

  3. Ansluter postgresql med sqlalchemy

  4. Hur man ändrar sekunder till ett tidsvärde i MySQL