我正在使用SQL server 2008,我正在尝试创建一个列来对Nominal_Date
,ID
和CODE
IF AUD_ACTN = ADD
进行Duration
求和,并且没有与原始ADD
重叠的AUD_ACTN = UPDATE
(请参阅Start_Time和Stop_Time(。如果有一个重叠的UPDATE
,那么我想对UPDATE
行的持续时间求和并忽略原始ADD
行。在我的数据中,将始终有 1 个"添加"或 1 个"添加"+任意数量的"更新"行(通常只有一个"更新"(,在存在多个"UPDATE"行的情况下,最近的"Upd_Timestamp"应优先。
也许有一种更聪明的方法可以解决这个问题,但基本上目的是,如果ADD
了一行,但随后UPDATE
编辑到不同的持续时间,我想捕获最近更新的持续时间。
这是我数据的一小部分样本
ID CODE Nominal_Date Start_Time Stop_Time Duration_Mins AUD_ACTN Upd_Timestamp
1 -989999998387.0 3/10/2017 3/10/17 14:30 3/10/17 20:30 360 ADD 11/1/16 2:25
1 -989999998387.0 3/10/2017 3/10/17 5:30 3/10/17 11:00 330 UPDATE 11/9/16 11:33
1 -989999998387.0 3/10/2017 3/10/17 5:30 3/10/17 8:00 150 UPDATE 3/2/17 18:41
1 -989999998387.0 3/10/2017 3/10/17 9:30 3/10/17 12:30 180 ADD 3/10/17 5:43
1 -989999998387.0 3/10/2017 3/10/17 14:30 3/10/17 17:30 180 UPDATE 3/10/17 5:43
1 -989999998371.0 3/10/2017 3/10/17 9:30 3/10/17 10:00 30 UPDATE 11/9/16 11:33
1 -989999970415.0 3/10/2017 3/10/17 14:30 3/10/17 20:30 360 ADD 11/1/16 2:25
1 -989999970415.0 3/10/2017 3/10/17 5:30 3/10/17 11:00 330 ADD 11/9/16 11:33
1 -989999970415.0 3/10/2017 3/10/17 5:30 3/10/17 8:00 150 UPDATE 3/2/17 18:41
1 -989999970415.0 3/10/2017 3/10/17 9:30 3/10/17 12:30 180 ADD 3/10/17 5:43
1 -989999970415.0 3/10/2017 3/10/17 14:30 3/10/17 17:30 180 UPDATE 3/10/17 5:43
1 -989999970399.0 3/10/2017 3/10/17 10:10 3/10/17 10:25 15 ADD 3/10/17 10:10
1 -989999970399.0 3/10/2017 3/10/17 10:17 3/10/17 10:25 8 UPDATE 3/10/17 21:18
1 -989858416947.0 3/10/2017 3/10/17 9:15 3/10/17 10:30 75 ADD 11/9/16 11:33
输出应如下所示
ID CODE Nominal_Date Start_Time Stop_Time Duration_Mins
1 -989999998387.0 3/10/2017 3/10/17 5:30 3/10/17 8:00 150
1 -989999998387.0 3/10/2017 3/10/17 9:30 3/10/17 12:30 180
1 -989999998387.0 3/10/2017 3/10/17 14:30 3/10/17 17:30 180
1 -989999998371.0 3/10/2017 3/10/17 9:30 3/10/17 10:00 30
1 -989999970415.0 3/10/2017 3/10/17 5:30 3/10/17 8:00 150
1 -989999970415.0 3/10/2017 3/10/17 9:30 3/10/17 12:30 180
1 -989999970415.0 3/10/2017 3/10/17 14:30 3/10/17 17:30 180
1 -989999970399.0 3/10/2017 3/10/17 10:17 3/10/17 10:25 8
1 -989858416947.0 3/10/2017 3/10/17 9:15 3/10/17 10:30 75
希望这是有道理的,如果我能澄清什么,请告诉我。
我不知道这是否是你想要的:
在 12 小时内超过圈数的示例数据:
select rowNumber, id,code,nominal_date,start_time,stop_time,duration_mins,upd_timestamp,HourDiff,case when HourDiff>12 then 'yes' else 'no' end as Overlap from
(select row_number() over(partition by id order by id) as rowNumber, id,code,nominal_date,start_time,stop_time,duration_mins,upd_timestamp,floor(datediff(Hour,start_time,stop_time))as HourDiff from @tb) as a
我只是包括rownumber
,希望也许你需要它。
这个在 12 小时内获得超过圈数的计数:
select count(1) from @tb where floor(datediff(Hour,start_time,stop_time)) > 12
您可以将其更改为24hrs
中的越圈 .
也许这个答案可以作为您获得Sum
的指南..因为我不太清楚。