Oracle
 sql >> Base de données >  >> RDS >> Oracle

Oracle Sélectionner la date maximale sur plusieurs enregistrements

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é.