Je pense que vous devez ajouter...
AND outside.asset_tag=inside.asset_tag
...aux critères de votre ON
liste.
Également une RIGHT OUTER JOIN
n'est pas nécessaire. Une INNER JOIN
donnera les mêmes résultats (et peut être plus efficace), puisqu'il n'y aura pas de combinaisons de asset_tag
et last_read_date
dans la sous-requête qui n'existent pas dans mp_vehicle_asset_profile
.
Même dans ce cas, la requête peut renvoyer plusieurs lignes par étiquette d'actif s'il existe des "égalités", c'est-à-dire plusieurs lignes avec le même last_read_date
. En revanche, la réponse analytique de @ Lamak choisira arbitrairement exactement une ligne dans cette situation.
Votre commentaire suggère que vous souhaitiez rompre les égalités en choisissant la ligne avec le mtr_reading
le plus élevé pour la last_read_date
.
Vous pouvez modifier la réponse analytique de @ Lamak pour ce faire en modifiant le ORDER BY
dans le OVER
clause à :
ORDER BY last_read_date DESC, mtr_reading DESC
S'il y a encore des liens (c'est-à-dire plusieurs lignes avec le même asset_tag
, last_read_date
, et mtr_reading
), la requête sélectionnera à nouveau arbitrairement exactement une ligne.
Vous pouvez modifier ma réponse basée sur l'agrégation pour rompre les liens en utilisant le plus haut mtr_reading
comme suit :
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
S'il y a encore des liens (c'est-à-dire plusieurs lignes avec le même asset_tag
, last_read_date
, et mtr_reading
), la requête peut à nouveau renvoyer plusieurs lignes.
Une autre façon dont les réponses analytiques et agrégées diffèrent est dans leur traitement des valeurs nulles. Si l'un des asset_tag
, last_read_date
, ou mtr_reading
sont nulles, la réponse basée sur l'analyse renverra des lignes associées, mais pas celle basée sur l'agrégation (car les conditions d'égalité dans la jointure ne sont pas évaluées à TRUE
lorsqu'un null est impliqué.