sql >> Database >  >> RDS >> Oracle

Oracle Max. datum selecteren op meerdere records

Ik denk dat je moet toevoegen...

AND outside.asset_tag=inside.asset_tag

...volgens de criteria in uw ON lijst.

Ook een RIGHT OUTER JOIN is niet nodig. Een INNER JOIN geeft dezelfde resultaten (en is mogelijk efficiënter), aangezien er geen combinaties van asset_tag kunnen zijn en last_read_date in de subquery die niet bestaan ​​in mp_vehicle_asset_profile .

Zelfs dan kan de zoekopdracht meer dan één rij per itemtag retourneren als er "banden" zijn -- dat wil zeggen, meerdere rijen met dezelfde last_read_date . Het analytische antwoord van @Lamak kiest daarentegen willekeurig precies één rij in deze situatie.

Je opmerking suggereert dat je de banden wilt verbreken door de rij te kiezen met de hoogste mtr_reading voor de last_read_date .

U kunt het analytische antwoord van @Lamak hiervoor aanpassen door de ORDER BY te wijzigen in de OVER clausule aan:

ORDER BY last_read_date DESC, mtr_reading DESC

Als er nog steeds gelijken zijn (d.w.z. meerdere rijen met dezelfde asset_tag , last_read_date , en mtr_reading ), zal de zoekopdracht opnieuw willekeurig precies één rij kiezen.

Je zou mijn op aggregatie gebaseerde antwoord kunnen wijzigen om banden te verbreken met de hoogste mtr_reading als volgt:

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

Als er nog steeds gelijken zijn (d.w.z. meerdere rijen met dezelfde asset_tag , last_read_date , en mtr_reading ), kan de zoekopdracht opnieuw meer dan één rij opleveren.

Een andere manier waarop de analytische en geaggregeerde antwoorden verschillen, is de behandeling van nullen. Als een van asset_tag , last_read_date , of mtr_reading null zijn, retourneert het op analyse gebaseerde antwoord gerelateerde rijen, maar het op aggregatie gebaseerde antwoord niet (omdat de gelijkheidsvoorwaarden in de join niet worden geëvalueerd als TRUE wanneer er een null in het spel is.



  1. mysql bestellen op geserialiseerde data?

  2. Een veilig inlogscript maken in PHP en MySQL zonder HTTPS

  3. ResultSet.next alleen erg traag als de query FIRST_ROWS of ROWNUM-beperking bevat

  4. Kan een Oracle SQL-query een string-query uitvoeren die is geselecteerd uit een tabel?