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

Oracle Vælg maks. dato på flere poster

Jeg tror, ​​du skal tilføje...

AND outside.asset_tag=inside.asset_tag

...til kriterierne i din ON liste.

Også en RIGHT OUTER JOIN er ikke nødvendig. En INNER JOIN vil give de samme resultater (og kan være mere effektive), da der ikke kan være kombinationer af asset_tag og last_read_date i underforespørgslen, der ikke findes i mp_vehicle_asset_profile .

Selv da kan forespørgslen returnere mere end én række pr. aktivtag, hvis der er "bindinger" -- det vil sige flere rækker med samme last_read_date . I modsætning hertil vil @Lamaks analytisk-baserede svar vilkårligt vælge præcis én række i denne situation.

Din kommentar antyder, at du vil bryde båndene ved at vælge rækken med højeste mtr_reading for last_read_date .

Du kan ændre @Lamaks analysebaserede svar for at gøre dette ved at ændre ORDER BY i OVER klausul til:

ORDER BY last_read_date DESC, mtr_reading DESC

Hvis der stadig er bindinger (dvs. flere rækker med det samme asset_tag , last_read_date , og mtr_reading ), vil forespørgslen igen abritrært vælge præcis én række.

Du kan ændre mit aggregatbaserede svar for at bryde båndene ved at bruge højeste mtr_reading som følger:

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

Hvis der stadig er bindinger (dvs. flere rækker med det samme asset_tag , last_read_date , og mtr_reading ), kan forespørgslen igen returnere mere end én række.

En anden måde, hvorpå de analytisk- og aggregatbaserede svar adskiller sig, er i deres behandling af nuller. Hvis nogen af ​​asset_tag , last_read_date , eller mtr_reading er nul, vil det analytisk-baserede svar returnere relaterede rækker, men det aggregerede-baserede vil ikke (fordi lighedsbetingelserne i joinforbindelsen ikke evalueres til TRUE når en nul er involveret.



  1. MySQL-forespørgsel - Registrerer mellem i dag og sidste 30 dage

  2. MySQL indstiller secure-file-priv til flere mapper

  3. JBoss7 + PostgreSQL Nye manglende/utilfredse afhængigheder

  4. Hvordan man laver en databaseforbindelse i anvendelse af Apache Tomcat ved hjælp af Struts 2