Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Oracle Select Max Date dla wielu rekordów

Myślę, że musisz dodać...

AND outside.asset_tag=inside.asset_tag

...do kryteriów w swoim ON lista.

Również RIGHT OUTER JOIN nie jest potrzebne. INNER JOIN da takie same wyniki (i może być bardziej efektywne), ponieważ nie będzie kombinacji asset_tag i last_read_date w podzapytaniu, które nie istnieje w mp_vehicle_asset_profile .

Nawet wtedy zapytanie może zwrócić więcej niż jeden wiersz na tag zasobu, jeśli istnieją „powiązania”, czyli wiele wierszy z tą samą last_read_date . W przeciwieństwie do tego, analityczna odpowiedź @Lamaka arbitralnie wybierze dokładnie jeden wiersz w tej sytuacji.

Twój komentarz sugeruje, że chcesz zerwać remisy, wybierając wiersz z najwyższym mtr_reading na last_read_date .

Możesz zmodyfikować odpowiedź @Lamaka opartą na analizie, aby to zrobić, zmieniając ORDER BY w OVER klauzula do:

ORDER BY last_read_date DESC, mtr_reading DESC

Jeśli nadal istnieją remisy (to znaczy wiele wierszy z tym samym asset_tag , last_read_date i mtr_reading ), zapytanie ponownie wybierze skrótowo dokładnie jeden wiersz.

Możesz zmodyfikować moją odpowiedź opartą na agregacji, aby zerwać remisy przy użyciu najwyższego mtr_reading w następujący sposób:

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

Jeśli nadal istnieją remisy (to znaczy wiele wierszy z tym samym asset_tag , last_read_date i mtr_reading ), zapytanie może ponownie zwrócić więcej niż jeden wiersz.

Innym sposobem, w jaki odpowiedzi oparte na analizie i agregatach różnią się, jest traktowanie wartości zerowych. Jeśli którykolwiek z asset_tag , last_read_date lub mtr_reading są null, odpowiedź oparta na analizie zwróci powiązane wiersze, ale ta oparta na agregacji nie zwróci (ponieważ warunki równości w łączeniu nie mają wartości TRUE gdy w grę wchodzi null.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak dodać 10 sekund w current_timestamp SQL ( Oracle )

  2. PLS-00306:błędna liczba lub typy argumentów w wezwaniu do

  3. AWS Python Lambda z Oracle

  4. Jak wywołać funkcję z parametrem Rowtype z instrukcji select w Oracle?

  5. Uruchom kod sql ze zmiennymi w oknie kodu Oracle SQL Developer