[英]How do a return has-many relations across two tables that have more than one row in the aggregate?
[英]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_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
您的問題(在對此答案的評論中澄清)要求:
如果存在具有行的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 )
你也可以偷偷摸摸地完成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.