[英]selecting 2nd and 3rd highest numbers for a group
我有一張桌子:
CREATE TABLE [dbo].[TargettingReport](
[MLISNPI] [varchar](50) NULL,
[CLIENT_ID1] [varchar](50) NULL,
[Sum of count] [int] NULL
) ON [PRIMARY]
我正在嘗試根據MLISNPI, CLIENT_ID1
選擇第二高和第二高的SUM OF COUNT
這是我如何為MLISNPI, CLIENT_ID1
每個唯一出現次數獲取最大值:
select [MLISNPI],[CLIENT_ID1],MAX([Sum of count])
from [TargettingReport]
group by
[MLISNPI],[CLIENT_ID1]
問題是如何獲得第二和第三高?
這是一些示例數據:
+---------+------------+--------------+
| MLISNPI | CLIENT_ID1 | sum of count |
+---------+------------+--------------+
| 567890 | 214060 | 18 |
| 678901 | 214060 | 58 |
| 789012 | 214060 | 27 |
| 891012 | 214060 | 1 |
| 101112 | 214060 | 23 |
| 003001 | 101596 | 0 |
| 003001 | 101522 | 436 |
| 003001 | 101597 | 0 |
| 003002 | 102165 | 66 |
| 003002 | 100062 | 1 |
| 003002 | 211074 | 1229 |
| 003006 | 102235 | 21 |
| 003014 | 213926 | 5 |
| 003016 | 213143 | 3 |
| 003023 | 213801 | 55 |
| 003023 | 212876 | 44 |
| 003023 | 100218 | 0 |
| 003028 | 211144 | 133 |
| 003041 | 100236 | 346 |
| 003041 | 103164 | 65 |
| 003051 | 213402 | 157 |
| 003058 | 100572 | 28 |
| 003065 | 101632 | 29 |
| 003071 | 213632 | 6 |
| 003072 | 101506 | 4 |
| 003081 | 100087 | 398 |
| 003083 | 214311 | 7 |
| 003117 | 210178 | 203 |
| 003121 | 214008 | 9 |
| 003139 | 102179 | 1635 |
| 003147 | 216022 | 21 |
| 003149 | 211425 | 1 |
| 003186 | 215748 | 1 |
+---------+------------+--------------+
; with numbered as
(
select *,
-- Assign number to each record
-- Numbering is separate for each pair of MLISNPI and CLIENT_ID1
-- Highest [Sum of desc] will get number 1 and so forth
row_number() over (partition by [MLISNPI], [CLIENT_ID1]
order by [Sum of count] desc) rn
from [TargettingReport]
)
select [MLISNPI],
[CLIENT_ID1],
[Sum of count]
from numbered
-- Now one can filter ranks
where rn between 2 and 3
更新 :圍繞mlisnpi旋轉[計數總和]
; with numbered as
(
select mlisnpi,
[sum of count],
-- Assign number to each record
-- Numbering is separate for each MLISNPI
-- Highest [Sum of desc] will get number 1 and so forth
row_number() over (partition by [MLISNPI]
order by [Sum of count] desc) rn
from [TargettingReport]
)
select mlisnpi,
[1] Rank1,
[2] Rank2,
[3] Rank3
from numbered
pivot (max([Sum of count]) for rn in ([1], [2], [3])) p
如果您實際上希望使用Cliend_ID1而不是[count of sum],只需用Client_ID1替換所有出現的[count of sum]。 不要將Client_ID1添加到cte,因為數據透視會將其包含在結果中,並在自己的行中顯示mlisnpi和Client_ID1的每種組合。
UPDATE2 :旋轉包括標題。 更加冗長,因為您需要合並所有標題(client_id1)並處理行號以獲得標題和總和的正確組合。 另外,您還需要將所有數據轉換為相同的數據類型(此處為varchar)才能使用union all
。
; with numbered as
(
select *,
row_number() over (partition by [MLISNPI]
order by [Sum of count] desc) rn
from [TargettingReport]
),
unioned as
(
select mlisnpi,
convert(varchar(20), [Sum of count]) value,
rn * 2 rn
from numbered
union all
select mlisnpi,
convert(varchar(20), [Client_ID1]),
rn * 2 - 1
from numbered
)
select mlisnpi,
[1] Client1,
[2] Rank1,
[3] Client2,
[4] Rank2,
[5] Client3,
[6] Rank3
from unioned
pivot (max(value) for rn in ([1], [2], [3], [4], [5], [6])) p
創建3個最高值的視圖
CREATE VIEW TESTVIEW
AS
SELECT ABB4.[MLISNPI], ABB4.[CLIENT_ID1], MAX(ABB4.[SUM OF COUNT]) AS NEW3
FROM TARGETTINGREPORT AS ABB4
LEFT JOIN (SELECT ABB2.[MLISNPI], ABB2.[CLIENT_ID1], MAX([SUM OF COUNT]) AS NEW2
FROM TARGETTINGREPORT AS ABB2
LEFT JOIN (SELECT [MLISNPI], [CLIENT_ID1], MAX([SUM OF COUNT]) AS NEW1
FROM TARGETTINGREPORT GROUP BY MLISNPI, [CLIENT_ID1])
AS ABB1 ON ABB1.MLISNPI = ABB2.MLISNPI AND ABB1.NEW1 = ABB2.[SUM OF COUNT] and ABB1.CLIENT_ID1 = ABB2.CLIENT_ID1
WHERE ABB1.MLISNPI IS NULL
GROUP BY ABB2.MLISNPI, ABB2.[CLIENT_ID1])
AS ABB3 ON ABB3.MLISNPI = ABB4.MLISNPI AND ABB3.NEW2 = ABB4.[SUM OF COUNT] AND ABB3.CLIENT_ID1 = ABB4.CLIENT_ID1
LEFT JOIN (SELECT ABB5.[MLISNPI], ABB5.[CLIENT_ID1], MAX([SUM OF COUNT]) AS NEW4
FROM TARGETTINGREPORT AS ABB5
GROUP BY ABB5.MLISNPI, ABB5.[CLIENT_ID1])
AS ABB6 ON ABB6.MLISNPI = ABB4.MLISNPI AND ABB6.NEW4 = ABB4.[SUM OF COUNT] AND ABB6.CLIENT_ID1 = ABB4.CLIENT_ID1
WHERE ABB3.MLISNPI IS NULL AND ABB6.MLISNPI IS NULL
GROUP BY ABB4.MLISNPI, ABB4.[CLIENT_ID1]
UNION ALL
SELECT ABB2.[MLISNPI], ABB2.[CLIENT_ID1], MAX([SUM OF COUNT]) AS NEW2
FROM TARGETTINGREPORT AS ABB2
LEFT JOIN (SELECT [MLISNPI], [CLIENT_ID1], MAX([SUM OF COUNT]) AS NEW1
FROM TARGETTINGREPORT GROUP BY MLISNPI, [CLIENT_ID1])
AS ABB1 ON ABB1.MLISNPI = ABB2.MLISNPI AND ABB1.NEW1 = ABB2.[SUM OF COUNT] AND ABB1.CLIENT_ID1 = ABB2.CLIENT_ID1
WHERE ABB1.MLISNPI IS NULL
GROUP BY ABB2.MLISNPI, ABB2.[CLIENT_ID1]
UNION ALL
SELECT [MLISNPI], [CLIENT_ID1], MAX([SUM OF COUNT]) AS NEW1
FROM TARGETTINGREPORT
GROUP BY MLISNPI, [CLIENT_ID1]
然后創建另一個視圖
CREATE VIEW TESTVIEW2
AS
SELECT ABB1.MLISNPI, ABB1.CLIENT_ID1, ABB1.NEW3
FROM TESTVIEW AS ABB1
LEFT JOIN (SELECT MLISNPI, CLIENT_ID1, MIN(NEW3) AS VAR1
FROM TESTVIEW
GROUP BY MLISNPI, CLIENT_ID1) AS ABB2
ON ABB2.MLISNPI = ABB1.MLISNPI AND ABB2.CLIENT_ID1 = ABB1.CLIENT_ID1 AND ABB2.VAR1 = ABB1.NEW3
LEFT JOIN (SELECT MLISNPI, CLIENT_ID1, MAX(NEW3) AS VAR2
FROM TESTVIEW
GROUP BY MLISNPI, CLIENT_ID1) AS ABB3
ON ABB3.MLISNPI = ABB1.MLISNPI AND ABB3.CLIENT_ID1 = ABB1.CLIENT_ID1 AND ABB3.VAR2 = ABB1.NEW3
WHERE ABB2.MLISNPI IS NULL AND ABB3.MLISNPI IS NULL
最后以數據透視表的形式調用3個最高值
SELECT TESTVIEW.MLISNPI, TESTVIEW.CLIENT_ID1, MAX(TESTVIEW.NEW3) AS '1', TESTVIEW2.NEW3 AS '2', MIN(TESTVIEW.NEW3) AS '3'
FROM TESTVIEW
LEFT JOIN TESTVIEW2 ON TESTVIEW2.MLISNPI = TESTVIEW.MLISNPI AND TESTVIEW2.CLIENT_ID1 = TESTVIEW.CLIENT_ID1
GROUP BY TESTVIEW.MLISNPI, TESTVIEW.CLIENT_ID1, TESTVIEW2.NEW3
您可以在rownum <3的地方執行操作,並從選擇的內容中刪除最大值嗎?
select top 3 [MLISNPI],[CLIENT_ID1], Max([Sum of count]) COUNTS
from [TargettingReport]
group by
[MLISNPI],[CLIENT_ID1]
ORDER by [Sum of count] desc
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.