sql-server - 如何使用保留顺序的运行计数形成查询

标签 sql-server sql-server-2008 query-optimization

我有一个如下所示的跟踪表

TraceTable

我想得到一个运行总计,它看起来像以下输出 - 我保留顺序非常重要 - 因为这是存储的 porcedures 的执行顺序 - 这将帮助我分析系统中的瓶颈

Output

我试过了

select max(RowNumber),objectname, count(1) from rob
where eventclass = 42
group by objectname

但这会破坏订单

这在 SQL 中是否可行?

更新: 我试过这个

select RowNumber,objectname, count(1) from rob
where eventclass = 42
group by objectname,RowNumber
order by RowNumber

但是这个(因为查询非常正确地说按行号分组(必须有它才能按顺序排列))

最佳答案

select objectname, 
       count(*)
from (
     select RowNumber,
            objectname,
            row_number() over(order by RowNumber) - row_number() over(order by objectname, RowNumber) as grp
     from rob
     where eventclass = 42
     ) as T
group by grp, objectname
order by min(RowNumber)

使用表变量的工作示例。

declare @T table
(
  RowNumber int,
  objectname varchar(50)
)

insert into @T values
(8, 'f_system_log_init'),
(10, 'f_purge_system_log'),
(25, 'f_system_log_msg'),
(65, 'f_system_log_msg'),
(104, 'f_system_log_msg'),
(143, 'f_system_log_msg'),
(182, 'f_system_log_msg'),
(221, 'f_system_log_msg'),
(5015, 'f_get_system_logs_parent_log_id_for_dataloader'),
(5055, 'f_system_log_msg'),
(5096, 'f_system_log_msg')

select objectname, 
       count(*)
from (
     select RowNumber,
            objectname,
            row_number() over(order by RowNumber) - row_number() over(order by objectname, RowNumber) as grp
     from @T
     ) as T
group by grp, objectname
order by min(RowNumber)

结果:

objectname                                         
-------------------------------------------------- -----------
f_system_log_init                                  1
f_purge_system_log                                 1
f_system_log_msg                                   6
f_get_system_logs_parent_log_id_for_dataloader     1
f_system_log_msg                                   2

关于sql-server - 如何使用保留顺序的运行计数形成查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11841924/

相关文章:

mysql 查询优化器

sql - 如何转换 hh :mm:ss to seconds in SQL Server with more than 24 hours

sql-server-2008 - 删除主键(聚集索引)以提高插入性能

mysql - 如何优化这个选择查询? (MySQL)

java - 优化帮助 : SQL Query to display minimum prices per country

sql-server-2005 - 这里可以使用 Common Table 表达式来提高性能吗?

C# + Sql Server - 多次执行存储过程。最好的办法?

c# - 访问 Microsoft.SqlServer.Management.Smo.Server 对象的成员正好崩溃一次

c# - 使用存储过程从 Dapper.net 查询返回值

sql-server-2008 - 动态插入到变量表语句 SQL Server