Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Oracle Select Max Date em vários registros


Acho que você precisa adicionar...
AND outside.asset_tag=inside.asset_tag

...aos critérios em seu ON Lista.

Também um RIGHT OUTER JOIN Não é necessário. Um INNER JOIN dará os mesmos resultados (e pode ser mais eficiente), pois não pode haver combinações de asset_tag e last_read_date na subconsulta que não existem em mp_vehicle_asset_profile .

Mesmo assim, a consulta pode retornar mais de uma linha por tag de recurso se houver "empates" -- ou seja, várias linhas com a mesma last_read_date . Em contraste, a resposta baseada em análise do @Lamak escolherá arbitrariamente exatamente uma linha nessa situação.

Seu comentário sugere que você deseja desempate escolhendo a linha com maior mtr_reading para a last_read_date .

Você pode modificar a resposta baseada em análise do @Lamak para fazer isso alterando o ORDER BY no OVER cláusula para:
ORDER BY last_read_date DESC, mtr_reading DESC

Se ainda houver empates (ou seja, várias linhas com a mesma asset_tag , last_read_date e mtr_reading ), a consulta novamente selecionará abreviadamente exatamente uma linha.

Você pode modificar minha resposta baseada em agregação para desempate usando o maior mtr_reading do seguinte modo:
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

Se ainda houver empates (ou seja, várias linhas com a mesma asset_tag , last_read_date e mtr_reading ), a consulta pode retornar mais de uma linha novamente.

Uma outra maneira pela qual as respostas baseadas em análise e agregação diferem é no tratamento de nulos. Se algum asset_tag , last_read_date , ou mtr_reading forem nulos, a resposta baseada em análise retornará linhas relacionadas, mas a baseada em agregação não (porque as condições de igualdade na junção não são avaliadas como TRUE quando um nulo está envolvido.