如何使用T-SQL增加行时间段的事件持续时间

时间:2011-03-17 10:59:21

标签: sql-server tsql sql-server-2008

我正在研究一个基于网络流量进行复杂计算的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将持续时间的增加或减少应用于数据?我有一个大型数据集,事件可以是任何持续时间,持续时间的增加/减少适用于所有事件。

如果增加事件持续时间以使其与另一个现有事件重叠,则还存在重叠问题。在这种情况下,重叠期间的值是现有值与持续时间增加/减少的值之和。

非常感谢任何帮助。

詹姆斯

1 个答案:

答案 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
    )

此查询允许您选择具有相同事件数的所有时间段。从那里,可以确定每个时段的持续时间,每个时段的开始和停止时间,以及每个时段中有多少事件。