簡體   English   中英

如何根據多個列的聚合返回單行

[英]How do I return a single row based on the aggregate of more than one column

抱歉模糊的標題,不確定如何搜索,或問這個問題。

讓我們說我們有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_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

您的問題(在對此答案的評論中澄清)要求:

  1. 每個FkId一行
  2. 最大日期和排名
  3. 結果對應於原始數據中的一行。

如果存在具有行的FkIds,使得最大日期和最大等級在單獨的行中,則必須至少放松這些要求中的一個。

如果您願意放寬要求(3),那么您可以使用GROUP BY

SELECT FkId, MAX(Rank) AS Rank, Max(Date) AS Date
FROM TableA
GROUP BY FkId

鑒於評論中的額外信息。 如果您想要每個FkId的最新排名條目,以下內容應該有效:

SELECT FkId, Rank, MAX(Date) AS Date
FROM TableA A
WHERE Rank = (SELECT MAX(Rank) 
              FROM TableA sub 
              WHERE A.FkId = sub.FkId 
              GROUP BY sub.FkId)
GROUP BY FkId, Rank

這是一個展示它的行動平方米

您可以使用Rank()和內聯查詢來實現它。


select * from TableA
where RowID in (
      select rowID from (
           select FKID, RowID, 
                  rank() over (partition by FKID order by [Rank] desc, [Date] desc) as RankNumber
                  from TableA ) A
      where A.RankNumber=1 ) 

SQL小提琴演示

你也可以偷偷摸摸地完成ljh建議如下

select top 1 with ties *
from TableA
order by rank() over (
  partition by FKID
  order by [Rank] desc, [Date] desc
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM