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不匹配.
您可以ROW_NUMBER与CTE一起使用(假设 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)