Eu tenho este código:
Select name, age , row_number() over (partition by name order by age desc) rn from my table
(objetivo: selecionar o cara mais velho entre os mesmos nomes)
Se eu quiser selecionar todos os registros numerados de linha 1
, acho que devo fazer:
Select ... from ( above query) where rn=1
Mas isso me obriga a envolvê-lo com outro select
.
Existe alguma outra solução em vez de embrulhar select
? (cte também é como embrulhar)
Isso geralmente não é possível, mas é no caso específico da sua pergunta.
As funções em janela são permitidas apenas nas etapas 5.1 e 6 no fluxograma de processamento de consulta lógica aqui (O
SELECT
eORDER BY
).SELECT
não pode ser usado para reduzir as linhas retornadas. No SQL Server 2008ORDER BY
só pode fazê-lo em conjunto comTOP
(Para 2012OFFSET ... FETCH
pode filtrar com base emORDER
). Como você está interessado apenas naqueles em que aROW_NUMBER
expressão é avaliada1
, neste caso, você pode usarSQL Fiddle
Após a discussão nos comentários sobre como isso pode ser estendido para obter a
TOP 2
partição por. Isso seria possívelEu pessoalmente não usaria nenhuma das consultas nesta resposta. Eu apenas agruparia a consulta em uma expressão de tabela e filtraria usando
WHERE
.