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.