sql - 从组、行号、排名中选择 SQL 前 N 行不起作用

标签 sql sql-server group-by rank row-number

在 SQL Server 中,我有一个包含以下字段的表。我想从每组中获取前 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 子句放在里面。

您可以使用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

这将返回每个站点代码的前 3 行。

关于sql - 从组、行号、排名中选择 SQL 前 N 行不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29002498/

相关文章:

php - 选择开始日期和结束日期后,对 sql 中的所有行求和

Python:Pyodbc 执行带参数的存储过程

php - 配置 PHP 5.3 以与 MS SQL Server 一起使用

mysql - 使用联接和分组依据从三个表中获取值

sql - ORA-01791-区分并排序

Scala-Spark 用参数值动态调用 groupby 和 agg

sql - 什么是简单的 SQL 查询来选择薪水第二高的人的 ID

sql - ANTLR4 : ordering problem of parser rules for a keyword used in several rules (AND, 之间)

mysql - 返回 SQL LIKE & GROUP BY 结果

mysql - MSSQL 将二进制日期时间导出到 MySql 日期时间