SQL Server SUM 基于另一列 IF 开始和停止时间不重叠



我正在使用SQL server 2008,我正在尝试创建一个列来对Nominal_DateIDCODEIF 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的指南..因为我不太清楚。

最新更新