Eu tenho a seguinte tabela no SQL Server 2019.
- A linha com a mais alta
id
é a linha mais nova. - A coluna
obj_id
tem um identificador imutável para um objeto. - A coluna
obj_name
tem o nome do objeto no momento em que a linha foi adicionada.
Eu iria | nome_obj | obj_id |
---|---|---|
5 | agora1 | 1 |
1 | anterior-anterior1 | 1 |
6 | agora2 | 2 |
4 | anterior1 | 1 |
3 | anterior2 | 2 |
2 | anterior-anterior2 | 2 |
O que eu preciso é o mais recente object_name
.
nome_obj |
---|
agora1 |
agora2 |
Tentei muitas coisas, sem sucesso. Uma das minhas ideias foi fazer o seguinte
SELECT DISTINCT
[obj_name]
FROM
[Table]
ORDER BY
[id] DESC
que falhou com este erro:
Os itens ORDER BY devem aparecer na lista de seleção se SELECT DISTINCT for especificado
Qual é uma maneira eficiente de atingir meu objetivo?
Você pode enumerar as linhas por obj_id na ordem desc id e, em seguida, escolher a(s) primeira(s) linha(s)
As funções da janela são suas amigas para esse tipo de problema.
ROW_NUMBER()
é a solução clássica, conforme a resposta de Lennart. Geralmente, é mais eficiente do que a resposta que estou prestes a fornecer, quando você tem vários campos dos quais deseja obter o valor mais recente, pois é apenas uma única chamada de função de janela em oposição a várias.Mas você só se importa com um único campo neste caso, então não deve ser muito diferente em termos de desempenho. Além disso, se você preferir um pouco menos de código por não precisar usar uma subconsulta ou CTE, e o desempenho for suficiente, é bom estar ciente das funções
FIRST_VALUE
e daLAST_VALUE
janela, que podem ser aproveitadas para resolver seu problema assim: