Oracle
 sql >> база данни >  >> RDS >> Oracle

Oracle Изберете максимална дата за множество записи

Мисля, че трябва да добавите...

AND outside.asset_tag=inside.asset_tag

...на критериите във вашия ON списък.

Също така RIGHT OUTER JOIN не е необходимо. INNER JOIN ще даде същите резултати (и може да бъде по-ефективен), тъй като няма да има комбинации от asset_tag и last_read_date в подзаявката, които не съществуват в mp_vehicle_asset_profile .

Дори тогава заявката може да върне повече от един ред на етикет на актив, ако има „връзки“ -- тоест множество редове с една и съща last_read_date . За разлика от това, аналитично базираният отговор на @Lamak ще избере произволно точно един ред в тази ситуация.

Вашият коментар предполага, че искате да развалите връзките, като изберете реда с най-висок mtr_reading за last_read_date .

Можете да модифицирате аналитично базирания отговор на @Lamak, за да направите това, като промените ORDER BY в OVER клауза към:

ORDER BY last_read_date DESC, mtr_reading DESC

Ако все още има връзки (т.е. множество редове с един и същ asset_tag , last_read_date и mtr_reading ), заявката отново ще избере само един ред.

Бихте могли да промените моя обобщен отговор, за да прекъснете връзките, като използвате най-високото mtr_reading както следва:

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

Ако все още има връзки (т.е. множество редове с един и същ asset_tag , last_read_date и mtr_reading ), заявката може отново да върне повече от един ред.

Друг начин, по който отговорите, базирани на анализи и агрегати, се различават, е в тяхното третиране на нули. Ако някой от asset_tag , last_read_date , или mtr_reading са null, аналитично базираният отговор ще върне свързани редове, но базираният на агрегат няма (тъй като условията за равенство в съединението не се оценяват като TRUE когато е включена нула.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да намерите най-припокриващия се период от време с периоди от време

  2. RobotFramework :cx_Oracle - FAIL :InternalError:Няма Oracle грешка?

  3. .Net - Създаване на набор от записи при поискване вместо изтегляне на всичко в паметта наведнъж

  4. ангажиране след избиране

  5. Функция TO_DATE в ORACLE