SQL Server Группировать с помощью фильтра - PullRequest
0 голосов
/ 02 июля 2018

У меня есть следующие требования для запроса данных:

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

ID  Time                Events
---------------------------------------
1   11/08/2013 00:06:51 cancel
1   11/08/2013 00:06:51 ans
1   11/08/2013 00:06:38 notification
1   11/08/2013 00:06:38 call
1   11/08/2013 00:06:38 notification
1   11/08/2013 00:06:38 active
2   11/08/2013 00:06:30 free
2   11/08/2013 00:06:30 **complete**
2   11/08/2013 00:06:13 call
2   11/08/2013 00:06:13 notification
2   11/08/2013 00:06:13 notification
2   11/08/2013 00:06:13 active

Пожалуйста, помогите мне с запросом SQL для этого.

Ответы [ 3 ]

0 голосов
/ 02 июля 2018

Исходя из моего понимания вашего вопроса (подлежит пересмотру на основе ваших разъяснений), довольно просто получить то, что вы хотите: во-первых, вы хотите любые элементы, в которых поле Events содержит слово "завершено". Кажется, это поле текстовое, поэтому вам, вероятно, потребуется использовать оператор LIKE, чтобы получить нужные записи:

select *
from Items
where upper(Events) like '%COMPLETE%'

Но, похоже, вам нужна разница во времени между первым и последним элементом в группе независимо от текста события. Таким образом, вы можете самостоятельно присоединиться к таблице, чтобы получить все элементы, а затем получить минимальное и максимальное время для этого элемента, группируя по идентификатору. Например, взгляните на следующее (я позволил себе переопределить вашу таблицу на Events и переименовать столбцы в EventID, EventTime и EventText:

select
    CompleteEvents.EventID
    ,min(AllEvents.EventTime) first_event
    ,max(AllEvents.EventTime) last_event
    ,datediff(s, min(AllEvents.EventTime), max(AllEvents.EventTime)) seconds_difference
from Events CompleteEvents
    inner join Events AllEvents on
        AllEvents.EventID = CompleteEvents.EventID
where 
    upper(CompleteEvents.EventText) like '%COMPLETE%'
group by CompleteEvents.EventID

Посмотрите на эту скрипту SQL для того же запроса.

0 голосов
/ 02 июля 2018

Я бы обработал это как:

SELECT id, DATEDIFF(seconds, MIN(time), MAX(time)) as num_seconds
FROM eventtable
GROUP BY id
HAVING SUM(CASE WHEN e.event = 'complete' THEN 1 ELSE 0 END); 
0 голосов
/ 02 июля 2018

Вы можете сделать что-то вроде:

SELECT id, datediff(minute, min(time), max(time)) as timediff
FROM eventtable
WHERE id in (SELECT id FROM eventtable WHERE Events = 'complete')
GROUP BY id
...