我正在研究一个基于网络流量进行复杂计算的SQL Server应用程序。
我有一个数据表,其中包含按时间段划分的每个链接的值。时间段是固定的,代表15分钟的间隔。例如,我有
Link A Time Period=0 Value=0<br>
Link A Time Period=1 Value=0<br>
Link A Time Period=2 Value=1<br>
Link A Time Period=3 Value=1<br>
Link A Time Period=4 Value=1<br>
Link A Time Period=5 Value=1<br>
Link A Time Period=6 Value=0<br>
Link A Time Period=7 Value=0<br>
Link A Time Period=8 Value=0<br>
Link A Time Period=9 Value=0<br>
Link A Time Period=10 Value=0<br>
值表示该时间段内该链接发生了一个事件。事件的持续时间是最后一个时间段和第一个时间段之间的差异。在该示例中,持续时间是时间段5-时间段2。
计算的输入指定持续时间的增加或减少。我们假设持续时间必须增加25%。在示例中,数据现在看起来像
Link A Time Period=0 Value=0<br>
Link A Time Period=1 Value=0<br>
Link A Time Period=2 Value=1<br>
Link A Time Period=3 Value=1<br>
Link A Time Period=4 Value=1<br>
Link A Time Period=5 Value=1<br>
Link A Time Period=6 Value=1<br>
Link A Time Period=7 Value=0<br>
Link A Time Period=8 Value=0<br>
Link A Time Period=9 Value=0<br>
Link A Time Period=10 Value=0<br>
如何使用T-SQL将持续时间的增加或减少应用于数据?我有一个大型数据集,事件可以是任何持续时间,持续时间的增加/减少适用于所有事件。
如果增加事件持续时间以使其与另一个现有事件重叠,则还存在重叠问题。在这种情况下,重叠期间的值是现有值与持续时间增加/减少的值之和。
非常感谢任何帮助。
詹姆斯
答案 0 :(得分:1)
要使用相同数量的事件隔离各个时间段,您可以使用如下查询:
declare @events table (
timeNbr int,
eventCount int
)
insert into @events values (0, 0)
insert into @events values (1, 0)
insert into @events values (2, 1)
insert into @events values (3, 1)
insert into @events values (4, 1)
insert into @events values (5, 1)
insert into @events values (6, 0)
insert into @events values (7, 0)
insert into @events values (8, 0)
insert into @events values (9, 0)
insert into @events values (10, 0)
insert into @events values (11, 0)
insert into @events values (12, 1)
insert into @events values (13, 1)
insert into @events values (14, 1)
insert into @events values (15, 1)
insert into @events values (16, 0)
insert into @events values (17, 2)
insert into @events values (18, 0)
insert into @events values (19, 0)
select startEvent.timeNbr as timeNbrStart, endEvent.timeNbr as timeNbrEnd,
startEvent.eventCount
from @events startEvent
join @events endEvent
on startEvent.timeNbr <= endEvent.timeNbr
where startEvent.eventCount > 0
and endEvent.eventCount = startEvent.eventCount
-- ensure that there all records in between these two records have the same number of events
and not exists (
select top 1 1 from @events
where timeNbr between startEvent.timeNbr and endEvent.timeNbr
and eventCount <> startEvent.eventCount
-- ensure that the start record is actually at the start of a period
) and not exists (
select top 1 1 from @events
where timeNbr = startEvent.timeNbr - 1
and eventCount = startEvent.eventCount
-- ensure that the end record is actually at the end of a period
) and not exists (
select top 1 1 from @events
where timeNbr = endEvent.timeNbr + 1
and eventCount = endEvent.eventCount
)
此查询允许您选择具有相同事件数的所有时间段。从那里,可以确定每个时段的持续时间,每个时段的开始和停止时间,以及每个时段中有多少事件。