2017-08-28 8 views
1

イベントを記録するSQL Server 2012データベースに、StartDateEndDateという列のテーブルがあります。ある期間内にすべてのレコードを集計し、重複期間を数えずに、どのイベントがアクティブであったかを判断する必要があります。私のテーブルはこのようになりますたとえば、:2017-08-28 12:00:00 PMから2017-08-28 2:00:00 PMにした検索する時間レコードのオーバーラップを検索

id  StartDate    EndDate 
======================================================= 
1  2017-08-28 12:00:00 PM 2017-08-28 12:01:00 PM 
2  2017-08-28 1:15:00 PM  2017-08-28 1:17:00 PM 
3  2017-08-28 1:16:00 PM  2017-08-28 1:20:00 PM 
4  2017-08-28 1:30:00 PM  2017-08-28 1:35:00 PM 

そして、私の期間、その後、私の所望の出力は次のようになります。

Duration of Events Active = 00:11:00

私がすることができましたレコードを集約して合計時間(基本的にはちょうどEndDate - StartDate)を取得しますが、重複する時間を排除する方法を理解できません。どんな助けもありがとう。ありがとう!

+0

ボーダーケースを理解するためにオーバーラップを含むサンプルを追加できますか? –

+0

必要なグラニュラリティ(たとえば、1分)に従って、すべての間隔を一連の行に分割します。必要な間隔内の別個の行を数える – Serg

答えて

1

CTEと集計についてはどうですか?これはサブクエリでも行うことができます。

declare @table table (id int, StartDate datetime, EndDate datetime) 
insert into @table 
values 

(1,'2017-08-28 12:00:00 PM','2017-08-28 12:01:00 PM'), 
(2,'2017-08-28 1:15:00 PM','2017-08-28 1:17:00 PM'), 
(3,'2017-08-28 1:16:00 PM','2017-08-28 1:20:00 PM'), 
(4,'2017-08-28 1:30:00 PM','2017-08-28 1:35:00 PM') 

declare @StartDate datetime = '2017-08-28 12:00:00' 
declare @EndDate datetime = '2017-08-28 14:00:00' 


;with cte as(
select 
    id 
    ,StartDate = case when StartDate < lag(EndDate) over (order by id) then lag(EndDate) over (order by id) else StartDate end 
    ,EndDate 
from 
    @table 
where 
    StartDate >= @StartDate 
and EndDate <= @EndDate), 


cte2 as(
select 
    Dur = datediff(second, StartDate, EndDate) 
from cte) 

select 
    Dur = convert(varchar, dateadd(ms, sum(Dur) * 1000, 0), 114) 
from 
    cte2 
+0

これは機能します!はるかに多くのデータでそれを手動で検証しました。ありがとう! – controller

+1

@controllerの心配はありません。レコードを別の一意の識別子で区切る必要がある場合は、lagステートメントにパーティションを追加してください。 – scsimon

関連する問題