3

私はこのようなトレーステーブルを持っています

トレーステーブル

次の出力のような現在の合計を取得したいと思います - 順序を保持することが非常に重要です - これは格納されたポーセデュアの実行順序であるため - システムのボトルネックを分析するのに役立ちます

出力

私が試してみました

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

しかし、これは(クエリが行番号によるグループをかなり正しく言っているように(順序でそれを持っている必要があります))

4

2 に答える 2

7
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
于 2012-08-07T09:08:37.227 に答える
2

これを試して:

;WITH CTE as (select *,ROW_NUMBER() over(order by rownumber,objectname) rn from test101)

,CTE1 as(
select *,1 as incr from CTE where rn=1 
union all
select t.*,
CASE WHEN t.objectname=c.objectname then incr else incr+1 end  as incr
from CTE t inner join CTE1 c
on t.rn=c.rn+1
)

select max(objectname),count(incr) from CTE1
group by incr
于 2012-08-07T09:23:23.970 に答える