Запрос для выявления пробелов во времени - PullRequest
1 голос
/ 13 мая 2011

Я довольно новичок в программировании баз данных, и мне нужна помощь в написании того, что кажется сложным запросом t-sql.

Наша база данных хранит данные времени вместе с различными уровнями, записанными на этомвремя.Типичное измерение будет длиться недели или месяцы.Мне нужно написать запрос в SqlServer2005, чтобы определить пробелы во временных данных, чтобы узнать, когда прибор не связывался.Наш интервал выборки может быть либо 1 секунда, либо 0,5 секунды, но он всегда будет одинаковым в данном измерении (то есть: все выборки в измерении будут либо 1, либо 0,5 выборки / сек).

В идеале я хотел бы получить список [block1-start block1-end] [block2-start block2-end] и т. Д.

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

Есть ли в TSQL команды, которые облегчили бы этот запрос?

Ответы [ 3 ]

5 голосов
/ 13 мая 2011

Проверьте это. Поскольку у вас нет перекрывающихся интервалов, вы можете написать простой SQL-запрос для возврата этих результатов. SQL ниже создает фиктивную переменную таблицы с именем @Events для имитации вашей таблицы измерений. Последний запрос выводит промежутки, превышающие 1 секунду (настраивается через переменную @MaxIntervalAllowedBetweenEvents).

-- table with dummy data
declare @Events table (
    ID          int IDENTITY NOT NULL,
    StartDate   datetime NOT NULL,
    EndDate     datetime NOT NULL
)
INSERT @Events VALUES ('1/1/2011 1:00am', '1/1/2011 2:00am')
INSERT @Events VALUES ('1/1/2011 2:00am', '1/1/2011 3:00am')  -- no gap after previous event
INSERT @Events VALUES ('1/1/2011 3:01am', '1/1/2011 4:00am')  -- 1 minute gap
INSERT @Events VALUES ('1/1/2011 4:30am', '1/1/2011 5:00am')  -- 30 minute gap


-- this variable defines the maximum interval allowed between events
declare @MaxIntervalAllowedBetweenEvents int
set @MaxIntervalAllowedBetweenEvents = 1    -- # seconds


-- select the gaps between events
SELECT
    e1.EndDate,
    Min(e2.StartDate) as NextEventStartDate,
    DateDiff(s, e1.EndDate, Min(e2.StartDate)) as SecondsBetweenEvents
FROM
    @Events as e1
join
    -- for each event in e1, get the event that immediately follows it
    @Events as e2
        on  (e1.EndDate <= e2.StartDate)
GROUP BY
    e1.EndDate
HAVING
    -- filter out events that are too close to each other
    (DateDiff(s, e1.EndDate, Min(e2.StartDate)) > @MaxIntervalAllowedBetweenEvents)
ORDER BY
    e1.EndDate
1 голос
/ 04 февраля 2015

Таблица, которая принимает данные Date, может использоваться для получения времени между входами в систему ...

Пропустить бит ROW_NUMBER, если в вашей таблице уже есть Identity.

{select 
    Start.ID
    ,Done.ID
    ,Start.<Date_Column>
    ,Done.<Date_Column>
    ,DATEDIFF(s,Start.<Date_Column>,Done.<Date_Column>) AS InBetween
from 
    (SELECT
        ROW_NUMBER() OVER (ORDER BY <Date_Column>) AS ID
        ,<Date_Column>
    FROM
        <Tablename> (NOLOCK)
    ) START
    INNER JOIN (
        SELECT
            ROW_NUMBER() OVER (ORDER BY <Date_Column>) AS ID
            ,<Date_Column>
        FROM
            <Tablename> (NOLOCK)
        ) DONE  ON START.ID + 1 = DONE.ID
ORDER BY
    DATEDIFF(s,Start.<Date_Column>,Done.<Date_Column>)DESC}
1 голос
/ 13 мая 2011

У Oracle есть много отличных аналитических функций для этого.

Я думаю, вам нужно создать курсор из оператора SQL, который упорядочит результаты по дате, времени начала, времени окончания.

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