从组中选择 SQL 前 N 行,row_number,排名不起作用
Selecting SQL TOP N rows from group, row_number, rank not working
在 SQL 服务器中,我有一个 table 具有以下字段。我想从每个组中获取前 N 行。我已经尝试使用 Rank() 和 Row_number() 跟随 sql 查询,但排名和行号不按顺序排列,因此无法限制行数。
这是我尝试过的 SQL 查询,正如您在结果中看到的那样,排名列没有序列号,因此 "where" 子句不适用于每个组的前 3 行。
与 ROW_NUMBER()、DENSE_RANK()
观察到的结果相似
SELECT Rs.RunID,rs.SiteCode,procedure_name,rs.total_cpu_time, rank
FROM (
SELECT RunID, SiteCode,total_cpu_time, procedure_name, rank()
over (Partition BY sitecode
ORDER BY total_cpu_time desc ) AS Rank
FROM TopProcs
-- ) rs WHERE Rank between 1 and 15 and RunID = 1 and SiteCode in ('CAS', 'P01')
) rs WHERE RunID = 1 and SiteCode in ('CAS', 'P01')
order by SiteCode`
这是输出,
RunID SiteCode procedure_name total_cpu_time rank
1 CAS spDRSActivation 117039139161 1
1 CAS spDRSSendChangesForGroup 155827022 2
1 CAS spDRSMsgBuilderActivation 153595640 3
1 CAS spGetChangeNotifications 360607 30
1 CAS spDRSSendSyncComplete 100169 65
1 CAS spSendRcmServiceBrokerMessage 88270 67
1 CAS spLogEntry 53466 78
1 P01 spDRSMsgBuilderActivation 62843590384 9
1 P01 spDRSSendChangesForGroup 62746448352 10
1 P01 spDrsSummarizeSendHistory 54443397908 13
1 P01 CH_SummarizePolicyRequests 35371363957 18
1 P01 spProcessDCMComplianceMsg 29790879064 25
1 P01 spUpdateComplianceDetails 22106121907 26
我假设您想要以 total_cpu_time
作为顺序获得 sitecode
分区的 TOP N
结果。如果你需要过滤数据,你可以把 Where
子句放在里面 afterwords 只是在内部查询中过滤。
您可以使用 Row_Number()
代替 rank()
,
SELECT rs.RunID,rs.SiteCode,rs.procedure_name,rs.total_cpu_time, rn
FROM (
SELECT
RunID,
SiteCode,
total_cpu_time,
procedure_name,
Row_Number() OVER (PARTITION BY SiteCode ORDER BY total_cpu_time DESC) AS rn
FROM TopProcs
WHERE
RunID = 1
AND SiteCode IN('CAS', 'P01')
) rs
WHERE
rs.rn < 4
ORDER BY SiteCode
这将 return 每个 SiteCode 的前 3 行。
你可以使用DENSE_RANK就好了:
SELECT Ranked.[SiteCode], Ranked.[procedure_name], Ranked.[total_cpu_time]
FROM (
SELECT [SiteCode], [procedure_name], [total_cpu_time], DENSE_RANK() OVER (PARTITION BY [SiteCode] ORDER BY [total_cpu_time] DESC) AS [Rank]
FROM #TopProcs
) Ranked
WHERE Ranked.[Rank] <= 3
在 SQL 服务器中,我有一个 table 具有以下字段。我想从每个组中获取前 N 行。我已经尝试使用 Rank() 和 Row_number() 跟随 sql 查询,但排名和行号不按顺序排列,因此无法限制行数。
这是我尝试过的 SQL 查询,正如您在结果中看到的那样,排名列没有序列号,因此 "where" 子句不适用于每个组的前 3 行。
与 ROW_NUMBER()、DENSE_RANK()
观察到的结果相似 SELECT Rs.RunID,rs.SiteCode,procedure_name,rs.total_cpu_time, rank
FROM (
SELECT RunID, SiteCode,total_cpu_time, procedure_name, rank()
over (Partition BY sitecode
ORDER BY total_cpu_time desc ) AS Rank
FROM TopProcs
-- ) rs WHERE Rank between 1 and 15 and RunID = 1 and SiteCode in ('CAS', 'P01')
) rs WHERE RunID = 1 and SiteCode in ('CAS', 'P01')
order by SiteCode`
这是输出,
RunID SiteCode procedure_name total_cpu_time rank
1 CAS spDRSActivation 117039139161 1
1 CAS spDRSSendChangesForGroup 155827022 2
1 CAS spDRSMsgBuilderActivation 153595640 3
1 CAS spGetChangeNotifications 360607 30
1 CAS spDRSSendSyncComplete 100169 65
1 CAS spSendRcmServiceBrokerMessage 88270 67
1 CAS spLogEntry 53466 78
1 P01 spDRSMsgBuilderActivation 62843590384 9
1 P01 spDRSSendChangesForGroup 62746448352 10
1 P01 spDrsSummarizeSendHistory 54443397908 13
1 P01 CH_SummarizePolicyRequests 35371363957 18
1 P01 spProcessDCMComplianceMsg 29790879064 25
1 P01 spUpdateComplianceDetails 22106121907 26
我假设您想要以 total_cpu_time
作为顺序获得 sitecode
分区的 TOP N
结果。如果你需要过滤数据,你可以把 Where
子句放在里面 afterwords 只是在内部查询中过滤。
您可以使用 Row_Number()
代替 rank()
,
SELECT rs.RunID,rs.SiteCode,rs.procedure_name,rs.total_cpu_time, rn
FROM (
SELECT
RunID,
SiteCode,
total_cpu_time,
procedure_name,
Row_Number() OVER (PARTITION BY SiteCode ORDER BY total_cpu_time DESC) AS rn
FROM TopProcs
WHERE
RunID = 1
AND SiteCode IN('CAS', 'P01')
) rs
WHERE
rs.rn < 4
ORDER BY SiteCode
这将 return 每个 SiteCode 的前 3 行。
你可以使用DENSE_RANK就好了:
SELECT Ranked.[SiteCode], Ranked.[procedure_name], Ranked.[total_cpu_time]
FROM (
SELECT [SiteCode], [procedure_name], [total_cpu_time], DENSE_RANK() OVER (PARTITION BY [SiteCode] ORDER BY [total_cpu_time] DESC) AS [Rank]
FROM #TopProcs
) Ranked
WHERE Ranked.[Rank] <= 3