SQL Server分组依据

时间:2018-07-02 15:28:23

标签: sql-server grouping sql-server-2016

查询数据有以下要求:

如果组中有完成事件,我想找到组中最后一个事件与第一个事件之间的时间差。

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 :(得分:2)

您可以执行以下操作:

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

答案 1 :(得分:0)

根据我对您问题的理解(根据您的澄清,可能会进行修订),您可以很轻松地获得所需的内容:首先,您需要Events字段包含“ complete”的所有项目。似乎该字段是文本,因此您可能需要使用LIKE运算符来获取所需的记录:

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

但是似乎您想要事件文本组不管中的第一个项目和最后一个项目之间的时差。因此,您可以自联接表以获取所有项目,然后获取该项目的最小和最大时间(按ID分组)。例如,请看以下内容(我很随意地将表重新定义为Events,并将列重命名为EventIDEventTimeEventText

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

看看this SQL Fiddle是否有相同的查询。

答案 2 :(得分:0)

我会这样处理:

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);