抱歉,标题不明确,不确定如何搜索或提出此问题。

假设我们有TableA:

RowID FkId排名日期
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日

我需要创建一个 View ,该 View 将为每个FkId返回1行。该行应为最大排名和最大日期。因此,对于FkId“A”,查询将返回“ID3”的行。

我可以使用子查询返回一行;首先,我得到MAX(Rank),然后加入另一个按FkId和Rank获得MAX(Date)组的查询。

选择表A. *
(从表A GROUP BY FkId中选择FkId,MAX(排名)AS排名)s1
内联接(从表A GROUP BY FkId,等级选择FkId,等级,最大日期作为日期)s2 ON s1.FkId = s2.FkId和s1.Rank = s2.Rank
s2.FkId = TableA.FkId和s2.Rank = TableA.Rank和s2.Date = TableA.Date的内部联接TableA

有没有更有效的查询可以达到相同的结果?感谢您的光临。

编辑:自上次回答以来添加了ID5。如果我尝试一个普通的MAX(rank),MAX(Date)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

关于sql - 如何基于多于一列的汇总返回一行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15624718/

10-09 04:55