如何根据多个列的聚合返回单行

cst*_*per 5 sql t-sql sql-server

抱歉模糊的标题,不确定如何搜索,或问这个问题.

让我们说我们有TableA:

RowID        FkId        Rank        Date
ID1          A           1           2013-3-1
ID2          A           2           2013-3-2
ID3          A           2           2013-3-3
ID4          B           3           2013-3-4
ID5          A           1           2013-3-5

我需要创建一个视图,为每个FkId返回1行.该行应该是最大排名和最大日期.因此对于FkId"A",查询将返回"ID3"的行.

我能够通过使用子查询返回单行; 首先我获得MAX(Rank),然后加入另一个通过FkId和Rank获得MAX(Date)组的查询.

SELECT TableA.*
(Select FkId, MAX(Rank) AS Rank FROM TableA GROUP BY FkId) s1 
INNER JOIN (Select FkId, Rank, MAX(Date) AS Date FROM TableA GROUP BY FkId,Rank) s2 ON s1.FkId = s2.FkId AND s1.Rank = s2.Rank 
INNER JOIN TableA ON s2.FkId = TableA.FkId AND s2.Rank = TableA.Rank AND s2.Date = TableA.Date

是否有更高效的查询可以实现相同的结果?谢谢你的期待.

编辑:自上次回答后添加了ID5.如果我尝试了正常的MAX(等级),MAX(日期)GROUP BY FkId,那么对于"A",我会得到A; 2; 2013年3月5日.此结果与RowId不匹配.

Tim*_*ter 4

您可以ROW_NUMBERCTE一起使用(假设 sql-server >= 2005):

WITH CTE AS
(
   SELECT TableA.*,
      RN = ROW_NUMBER() OVER (PARTITION BY FkId Order By Rank Desc, Date DESC)
   FROM Table A
)
SELECT RowID,FkId, Rank,Date
FROM CTE WHERE RN = 1
Run Code Online (Sandbox Code Playgroud)