如標題所述,我希望選擇前 3 個值,如果計算的值重復,也包括它。
SELECT b.planID, count(b.planID) AS PopularPlan
FROM dbo.Subscriber as b
GROUP BY B.planID
ORDER BY count(b.planID) DESC;
此輸出回傳所有最大值,例如:
PlanID PopularPlan
101 2555
123 2555
432 2390
23 2390
45 2090
12 2080
55 2090
如果我要使用 TOP 3,請使用以下 SQL 選擇 TOP 3:
SELECT TOP 3 b.planID, count(b.planID) AS PopularPlan
FROM dbo.Subscriber as b
GROUP BY B.planID
ORDER BY count(b.planID) DESC;
它將回傳以下內容:
PlanID PopularPlan
101 2555
123 2555
432 2390
在這種情況下所需的輸出是做我想做的事情:
PlanID PopularPlan
101 2555
123 2555
432 2390
23 2390
45 2090
我知道 TOP 3 僅限于三個結果,但如果重復,我似乎無法弄清楚如何添加的方法。
此外,如果我要包括 WITH TIES:
SELECT TOP 3 WITH TIES b.planID, count(b.planID) AS PopularPlan
FROM dbo.Subscriber as b
GROUP BY B.planID
ORDER BY count(b.planID) DESC;
這種情況下的輸出是:
PlanID PopularPlan
101 2555
123 2555
432 2390
23 2390
測驗時,如果我選擇 TOP 5,則會出現 2090 值,但如果可能的話,我希望對 TOP 3 執行相同的操作,以便輸出保持原樣:
PlanID PopularPlan
101 2555
123 2555
432 2390
23 2390
45 2090 <- has to have this value too
uj5u.com熱心網友回復:
DENSE_RANK() 是你的朋友:
WITH cteOriginal AS
(
SELECT b.planID, count(b.planID) AS PopularPlan
FROM dbo.Subscriber as b
GROUP BY B.planID
)
, cteDenseRank AS
(
SELECT *, DENSE_RANK() OVER( ORDER BY PopularPlan DESC) AS DRank
FROM cteOriginal
)
SELECT planID, PopularPlan
FROM cteDenseRank
WHERE DRank <= 3
ORDER BY PopularPlan DESC
;
據推測,您可以將兩個 CTE 合并在一起,但我永遠不確定 OVER 函式與 GROUP BY 的確切互動方式,所以我這樣做的時間稍長一些。
我個人可以說,自從 T-SQL (2008?) 中出現 ROW_NUMBER()、RANK() 和 DENSE_RANK() 視窗函式后,我幾乎不再使用 TOP。
編輯 - DENSE_RANK() 以顯示最佳結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/358096.html
上一篇:如何從未確定的組中獲取第一個值
下一篇:根據特定條件查找重復值
