Как получить состояние активности, произошедшее в течение интервала во время запуска и остановки datetime (SQL) (t-SQL) - PullRequest
0 голосов
/ 21 сентября 2019

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

EventName     OccuredAtDatetime
EventA        2019-07-03 00:14:01
EventA        2019-07-03 01:14:01
EventA        2019-07-03 01:34:01
EventB        2019-07-03 01:13:03

Я хотел бы знать, произошло ли событие в течение интервала времени (30 минут в этом примере), скажем, время начала как 2019-07-03 00:00:00 и конечное время как 2019-07-03 02:00:00, интервал будет выглядеть как

IntervalName     StartTime                EndTime
Interval1       2019-07-03 00:00:00       2019-07-03 00:30:00
Interval2       2019-07-03 00:30:00       2019-07-03 01:00:00
Interval3       2019-07-03 01:00:00       2019-07-03 01:30:00
Interval4       2019-07-03 01:30:00       2019-07-03 02:00:00

Таким образом, вывод будет выглядеть как

EventName     Interval1    Interval2       Interval3        Interval4
EventA        Yes          No              Yes              Yes
EventB        No           No              Yes              No

Это также моя первая публикация на stackoverflow, поэтому, пожалуйста, дайте мне знать, если данные не в предпочтительном формате или есть какие-либо дополнительные вопросы.Спасибо!

Ответы [ 2 ]

1 голос
/ 21 сентября 2019

Предполагая, что ваши таблицы называются событиями и интервалами, это будет делать:

with cte as (
select e.EventName,
    i.IntervalName
from Events as e
    cross apply Intervals as i 
where e.OccuredAtDatetime>= i.StartTime
  and e.OccuredAtDatetime < i.EndTime
)
select  e.EventName,
        max(IIF(c.IntervalName='Interval1','Yes','No')) as Interval1,
        max(IIF(c.IntervalName='Interval2','Yes','No')) as Interval2,
        max(IIF(c.IntervalName='Interval3','Yes','No')) as Interval3,
        max(IIF(c.IntervalName='Interval4','Yes','No')) as Interval4
from events as e
    left outer join cte as c ON e.EventName = c.EventName
group by e.EventName

По сути, cte находит все экземпляры, которые произошли, а второй выбор предназначен только для форматирования в соответствии с тем, что вы просили.

0 голосов
/ 21 сентября 2019

Этого можно достичь, выполнив динамический SQL-запрос.

Запрос

declare @sql as varchar(max);
select @sql = 'select [t1].[EventName], ' + stuff((
        select ', max(case when [IntervalName] = ' + char(39) + [IntervalName] + char(39)
        + ' and [t1].OccuredAtDatetime between [t2].[StartTime] and [t2].[EndTime] then '
        + char(39) + 'Yes' + char(39) + ' else ' + char(39) + 'No' + char(39) 
        + ' end) as [' + [IntervalName] + ']'
        from [intervals]
        for xml path('')
    ),
    1, 1, ''
)
+ ' from [events] as [t1], [intervals] as [t2]'
+ ' group by [t1].[EventName];';

exec(@sql);

Найти демонстрацию здесь

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