我有以下查询来获取与最新日期对应的值:
SELECT MAX(RowAddedDate), X, Y
FROM dbo.MyTable
GROUP BY X, Y
这很好,但我需要获取此查询中每一行的 ID。如果我添加 ID,我会得到所有内容,因为 ID 需要在GROUP BY
.
我该如何解决这个问题?
我有以下查询来获取与最新日期对应的值:
SELECT MAX(RowAddedDate), X, Y
FROM dbo.MyTable
GROUP BY X, Y
这很好,但我需要获取此查询中每一行的 ID。如果我添加 ID,我会得到所有内容,因为 ID 需要在GROUP BY
.
我该如何解决这个问题?
您可以使用窗口(排名)。为此的功能:
如果多行具有相同的日期且 X 和 Y 相同,则由于
DENSE_RANK()
.如果您只想要一个,您可以将其替换为
ROW_NUMBER()
并调整ORDER BY
以控制将返回哪些绑定行。至于效率,索引
(X, Y, RowAddedDate) INCLUDE (ID)
会有所帮助。您可以使用窗口 MAX() 以一种在语义上非常接近您发现但不涉及连接的方式来实现结果:
每个X、Y的RowAddedDate的最大值与非聚合值一起返回。您只需过滤最大值即可获得所需的行。
好吧,我一发这个就脑子一热。不过,答案可能会对某人有所帮助。
查询中的组合可能
MAX(RowAddedDate), X, Y
不是唯一的,因此不能保证查询每行返回一个 ID。因此,我将不得不
JOIN
将这三个值作为连接条件在表本身上。