Eu tenho a seguinte consulta para obter os valores correspondentes à última data:
SELECT MAX(RowAddedDate), X, Y
FROM dbo.MyTable
GROUP BY X, Y
Isso é bom, mas preciso obter o ID de cada linha nesta consulta. Se eu adicionar o ID, recebo tudo, pois o ID precisa estar no arquivo GROUP BY
.
Como resolvo isso?
Você pode usar a janela (classificação). funções para isso:
Se várias linhas tiverem a mesma data com os mesmos X e Y, todas elas serão retornadas devido ao
DENSE_RANK()
.Se você quiser apenas um, poderá substituí-lo
ROW_NUMBER()
e ajustar oORDER BY
para controlar qual das linhas empatadas será retornada.Quanto à eficiência, um índice sobre
(X, Y, RowAddedDate) INCLUDE (ID)
ajudaria.Você poderia usar uma janela MAX() para obter o resultado de uma maneira semanticamente muito próxima daquela que você descobriu, mas não envolve uma junção:
Os valores máximos de RowAddedDate por X, Y são retornados juntamente com valores não agregados. Basta filtrar os valores máximos para obter as linhas desejadas.
OK, tive um flash cerebral assim que postei isso. Ainda assim, a resposta pode ajudar alguém.
É possível que a combinação de
MAX(RowAddedDate), X, Y
na consulta não seja exclusiva, portanto, não é possível garantir que a consulta retorne um único ID por linha.Como tal, terei que colocar
JOIN
a tabela em si mesma com esses três valores como condição de junção.