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.