HOWTO Увеличение длительности события, когда строки по периоду времени, с использованием T-SQL - PullRequest
0 голосов
/ 17 марта 2011

Я работаю над приложением 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 Ответ

1 голос
/ 17 марта 2011

Чтобы изолировать различные периоды времени с одинаковым количеством событий, вы можете использовать запрос, подобный следующему:

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
    )

Этот запрос позволит вам выбрать все периоды времени с одинаковым количеством событий. Отсюда можно определить, сколько длится каждый период, когда каждый период начинается и заканчивается, и сколько событий происходит в каждом периоде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...