sql >> Databáze >  >> RDS >> Oracle

Oracle Select Max Date on Multiple Records

Myslím, že musíte přidat...

AND outside.asset_tag=inside.asset_tag

...na kritéria ve vašem ON seznam.

Také RIGHT OUTER JOIN není potřeba. INNER JOIN poskytne stejné výsledky (a může být efektivnější), protože nebudou existovat kombinace asset_tag a last_read_date v poddotazu, které neexistují v mp_vehicle_asset_profile .

I v tomto případě může dotaz vrátit více než jeden řádek na značku díla, pokud existují „shody“ – tedy více řádků se stejným last_read_date . Naproti tomu odpověď @Lamak založená na analýze v této situaci libovolně vybere přesně jeden řádek.

Váš komentář naznačuje, že chcete přerušit vazby výběrem řádku s nejvyšší hodnotou mtr_reading pro last_read_date .

Chcete-li to provést, můžete upravit odpověď @Lamak na základě analýzy změnou ORDER BY v OVER doložka k:

ORDER BY last_read_date DESC, mtr_reading DESC

Pokud stále existují remízy (tj. více řádků se stejným asset_tag , last_read_date a mtr_reading ), dotaz opět svévolně vybere přesně jeden řádek.

Moji agregovanou odpověď můžete upravit tak, abyste přerušili vazby pomocí nejvyššího mtr_reading takto:

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

Pokud stále existují remízy (tj. více řádků se stejným asset_tag , last_read_date a mtr_reading ), může dotaz opět vrátit více než jeden řádek.

Dalším způsobem, jak se analytické a agregované odpovědi liší, je jejich zacházení s nulami. Pokud některý z asset_tag , last_read_date nebo mtr_reading jsou null, analytická odpověď vrátí související řádky, ale agregovaná odpověď ne (protože podmínky rovnosti ve spojení nejsou vyhodnoceny jako TRUE když se jedná o nulu.



  1. Jak mohu efektivně vybrat předchozí nenulovou hodnotu?

  2. optimalizace dotazu s příkazem case

  3. Jak vyčíslit skupiny oddílů v mé tabulce Postgres s funkcemi okna?

  4. Jak implementovat vnořený systém komentářů?