Sql 为组选择第二和第三高的数字
我有一张桌子:Sql 为组选择第二和第三高的数字,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我有一张桌子: CREATE TABLE [dbo].[TargettingReport]( [MLISNPI] [varchar](50) NULL, [CLIENT_ID1] [varchar](50) NULL, [Sum of count] [int] NULL ) ON [PRIMARY] 我正试图根据MLISNPI,CLIENT_ID1 这就是我如何获得MLISNPI,CLIENT_ID1的每个唯一事件的最大值的方法: select [MLISNPI],
CREATE TABLE [dbo].[TargettingReport](
[MLISNPI] [varchar](50) NULL,
[CLIENT_ID1] [varchar](50) NULL,
[Sum of count] [int] NULL
) ON [PRIMARY]
我正试图根据MLISNPI,CLIENT_ID1
这就是我如何获得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 |
+---------+------------+--------------+
您是否可以执行where rownum<3并从select中删除最大值
select top 3 [MLISNPI],[CLIENT_ID1], Max([Sum of count]) COUNTS
from [TargettingReport]
group by
[MLISNPI],[CLIENT_ID1]
ORDER by [Sum of count] desc
您是否可以执行where rownum<3并从select中删除最大值
select top 3 [MLISNPI],[CLIENT_ID1], Max([Sum of count]) COUNTS
from [TargettingReport]
group by
[MLISNPI],[CLIENT_ID1]
ORDER by [Sum of count] desc
更新:围绕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而不是[Sum of count],只需将所有出现的[Sum of count]替换为Client_ID1即可。不要将Client_ID1添加到cte中,因为pivot将在结果中包含它,并在自己的行中显示mlisnpi和Client_ID1的每个组合
更新2:包含标题的旋转。更详细一点,因为您需要联合所有标题(client_id1)并操纵行号以获得标题和总和的正确组合。此外,您还需要将all转换为相同的数据类型(此处为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
更新:围绕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而不是[Sum of count],只需将所有出现的[Sum of count]替换为Client_ID1即可。不要将Client_ID1添加到cte中,因为pivot将在结果中包含它,并在自己的行中显示mlisnpi和Client_ID1的每个组合
更新2:包含标题的旋转。更详细一点,因为您需要联合所有标题(client_id1)并操纵行号以获得标题和总和的正确组合。此外,您还需要将all转换为相同的数据类型(此处为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
.创建三个顶级值的视图
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
最后调用pivot表单中的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
创建三个顶级值的视图
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
最后调用pivot表单中的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
你能发布一个答案而不是另一个问题吗?@mellamokb ok编辑答案以包括在内answer@mellamokb你在玩箭吗?哈哈哈哈哈网站很奇怪,我也看到了:-)安德鲁谢谢你,但我需要每个mlisnpi的前三名,客户ID 1你能发布一个答案而不是另一个问题吗?@mellamokb ok编辑答案以包括在内answer@mellamokb你在玩箭吗?哈哈哈哈哈这个网站很奇怪,我也看到了:-)andrew谢谢你,但我需要每个mlisnpi的前3名,客户机ID 1在这种情况下,你需要准备一些示例数据,因为只有当所有的[mlisnpi],[client_ID 1]都是唯一的时,这可能会返回所有的1。所以每次出现的mlisnpi和客户机ID 1都是唯一的。所有组的大小都为一。没有第一,第二,第三。他们都是第一名。你到底想要什么?很抱歉,我没有发布完整的数据,肯定会出现不止一个,为糟糕的数据感到抱歉。同样,尼古拉,我想知道你是否可以告诉我如何把它放在这样的格式:而不是所有的排名堆叠在一起,我想要:MLISNPI,rank1号,rank2号,rank3号OWW!这太棒了!!我;我很抱歉,但是有可能为每个排名偷偷输入客户ID吗?因此,MLISNPI,CLIENT1,SUM1,client2,sum2,client3,sum3??在这种情况下,您需要准备一些示例数据,因为只有当所有的[MLISNPI]、[CLIENT_ID1]都是唯一的时,才会返回所有的1。因此,MLISNPI和CLIENT_ID1的每次出现都是唯一的。所有组的大小都为一。没有第一,第二,第三。他们都是第一名。你到底想要什么?很抱歉,我没有发布完整的数据,肯定会出现不止一个,为糟糕的数据感到抱歉。同样,尼古拉,我想知道你是否可以告诉我如何把它放在这样的格式:而不是所有的排名堆叠在一起,我想要:MLISNPI,rank1号,rank2号,rank3号OWW!这太棒了!!我;我很抱歉,但是有可能为每个排名偷偷输入客户ID吗?所以MLISNPI,CLIENT1,SUM1,client2,sum2,client3,sum3??哇,非常感谢这太棒了!!你能帮我以这种格式得到这个吗:MLISNPI,CLIENT_ID1(max),CLIENT_ID1 second to max,CLIENT_ID1 3rd to maxHey,我修改了上面的代码,所以你可以在pivot formwow中得到结果,非常感谢这太棒了!!你能帮我以这种格式得到这个吗:MLISNPI,CLIENT_ID1(max),CLIENT_ID1 second to max,CLIENT_ID1 3rd to maxey,我修改了上面的代码,所以你可以以pivot形式得到结果