Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 查询以获取每个组的组的最大时间_Sql_Sql Server_Sql Server 2014 - Fatal编程技术网

Sql 查询以获取每个组的组的最大时间

Sql 查询以获取每个组的组的最大时间,sql,sql-server,sql-server-2014,Sql,Sql Server,Sql Server 2014,我有以下格式的数据,希望以第二种格式输出。我尝试了在id、时间和事件上对数据和分组进行自连接,但我尝试的任何操作似乎都不正确 EV-2处的时间为开始时间,EV-5处的时间为结束时间。EV-5时间可以写为每个EV-2-EV-5事件的结束时间 谢谢你对这件事的指导 ID TIME EVENT 1 2016-03-21 12:30:00.000 EV-1 1 2016-03-21 12:30:30.000 EV-2 1

我有以下格式的数据,希望以第二种格式输出。我尝试了在id、时间和事件上对数据和分组进行自连接,但我尝试的任何操作似乎都不正确

EV-2处的时间为开始时间,EV-5处的时间为结束时间。EV-5时间可以写为每个EV-2-EV-5事件的结束时间

谢谢你对这件事的指导

ID  TIME                        EVENT
1   2016-03-21 12:30:00.000     EV-1    
1   2016-03-21 12:30:30.000     EV-2
1   2016-03-21 12:33:00.000     EV-3
1   2016-03-21 12:33:00.000     EV-4
1   2016-03-21 12:33:45.000     EV-5
1   2016-03-21 12:33:50.000     EV-1    
1   2016-03-21 12:33:55.000     EV-2
1   2016-03-21 12:35:15.000     EV-3
1   2016-03-21 12:35:15.000     EV-4
1   2016-03-21 12:40:20.000     EV-5
2   2016-03-21 12:40:50.000     EV-1    
2   2016-03-21 12:41:25.000     EV-2
2   2016-03-21 12:41:25.000     EV-3
2   2016-03-21 12:42:13.000     EV-4
2   2016-03-21 12:47:35.000     EV-5

Output
ID  TIME(startTime)             EVENT   endTime
1   2016-03-21 12:30:00.000     EV-1    
1   2016-03-21 12:30:30.000     EV-2    2016-03-21 12:33:45.000
1   2016-03-21 12:33:00.000     EV-3    2016-03-21 12:33:45.000
1   2016-03-21 12:33:00.000     EV-4    2016-03-21 12:33:45.000
1   2016-03-21 12:33:45.000     EV-5    2016-03-21 12:33:45.000
1   2016-03-21 12:33:50.000     EV-1    
1   2016-03-21 12:33:55.000     EV-2    2016-03-21 12:40:20.000
1   2016-03-21 12:35:15.000     EV-3    2016-03-21 12:40:20.000
1   2016-03-21 12:35:15.000     EV-4    2016-03-21 12:40:20.000
1   2016-03-21 12:40:20.000     EV-5    2016-03-21 12:40:20.000
2   2016-03-21 12:40:50.000     EV-1    
2   2016-03-21 12:41:25.000     EV-2    2016-03-21 12:47:35.000
2   2016-03-21 12:41:25.000     EV-3    2016-03-21 12:47:35.000
2   2016-03-21 12:42:13.000     EV-4    2016-03-21 12:47:35.000
2   2016-03-21 12:47:35.000     EV-5    2016-03-21 12:47:35.000
我所尝试的:

select d.ID, d.TIME, d.EVENT, max(dd.TIME) endTime
from dataTable d
  inner join dataTable dd on d.ID = dd.ID and d.EVENT = dd.EVENT and d.TIME < dd.TIME
group by d.ID, d.TIME, d.EVENT
选择d.ID、d.TIME、d.EVENT、max(dd.TIME)endTime
从数据表d
d.ID=dd.ID和d.EVENT=dd.EVENT和d.TIME
简单解决方案,使用相关子选择返回大于或等于当前行时间的最小EV-5倍。(对于除EV-1以外的所有事件,使用
case
表达式执行此操作。)


left join
如果需要,还可以返回没有任何EV-5的id。)

@jarhl的DBMS逻辑支持SQL Server 2014等窗口聚合函数:

SELECT t.*,
   CASE
     WHEN EVENT <> 'EV-1' 
     THEN MIN(CASE WHEN EVENT = 'EV-5' THEN TIME end) 
          OVER (PARTITION BY ID -- maybe not needed 
                ORDER BY TIME
                ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
   END AA endTime
FROM tablename AS t1
选择t.*,
案例
当事件“EV-1”发生时
然后是最小值(事件='EV-5'然后是时间结束时的情况)
超过(按ID分区--可能不需要
按时间订购
当前行和无界行之间的行(如下所示)
结束AA结束时间
从表名开始,设置为t1

请将您的ID列更正为实际ID,然后重试

IF (SELECT OBJECT_ID('tempdb..#Events')) IS NOT NULL
BEGIN
    DROP TABLE #Events
END

CREATE TABLE #Events (ID INT,EventTime datetime, eventName varchar(4))
INSERT INTO #Events
VALUES        
(1, '2016-03-21 12:30:00.000','EV-1'),
(1, '2016-03-21 12:30:30.000','EV-2'),
(1, '2016-03-21 12:33:00.000','EV-3'),
(1, '2016-03-21 12:33:00.000','EV-4'),
(1, '2016-03-21 12:33:45.000','EV-5'),
(2, '2016-03-21 12:33:50.000','EV-1'),
(2, '2016-03-21 12:33:55.000','EV-2'),
(2, '2016-03-21 12:35:15.000','EV-3'),
(2, '2016-03-21 12:35:15.000','EV-4'),
(2, '2016-03-21 12:40:20.000','EV-5'),
(3, '2016-03-21 12:40:50.000','EV-1'),
(3, '2016-03-21 12:41:25.000','EV-2'),
(3, '2016-03-21 12:41:25.000','EV-3'),
(3, '2016-03-21 12:42:13.000','EV-4'),
(3, '2016-03-21 12:47:35.000','EV-5')
;
WITH cteEvent AS
(
    SELECT ID, EventTime AS startTime,en.endTime
    FROM #Events e
    CROSS APPLY (
                    SELECT EventName,EventTime AS endTime 
                    FROM #Events e2 
                    WHERE e2.ID = e.id AND CAST(RIGHT(e2.eventname,1) AS INT) = 5) as en
    WHERE e.EventName = 'EV-1'
)
SELECT c.id,eventName,startTime,
    CASE 
        WHEN eventName = 'EV-1' 
        THEN NULL
        ELSE endTime
    END  AS endTime
FROM cteEvent c
LEFT JOIN #Events e ON c.id = e.id

什么是您的DBMS?您可以显示您尝试过的查询吗?从数据表d中选择d.ID、d.TIME、d.EVENT、max(dd.TIME)endTime。在d.ID=dd.ID和d.EVENT=dd.EVENT上,从数据表d内部连接数据表dd。d.ID=dd.ID和d.EVENT=dd.EVENT和d.TIMESELECT t.*, CASE WHEN EVENT <> 'EV-1' THEN MIN(CASE WHEN EVENT = 'EV-5' THEN TIME end) OVER (PARTITION BY ID -- maybe not needed ORDER BY TIME ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) END AA endTime FROM tablename AS t1
IF (SELECT OBJECT_ID('tempdb..#Events')) IS NOT NULL
BEGIN
    DROP TABLE #Events
END

CREATE TABLE #Events (ID INT,EventTime datetime, eventName varchar(4))
INSERT INTO #Events
VALUES        
(1, '2016-03-21 12:30:00.000','EV-1'),
(1, '2016-03-21 12:30:30.000','EV-2'),
(1, '2016-03-21 12:33:00.000','EV-3'),
(1, '2016-03-21 12:33:00.000','EV-4'),
(1, '2016-03-21 12:33:45.000','EV-5'),
(2, '2016-03-21 12:33:50.000','EV-1'),
(2, '2016-03-21 12:33:55.000','EV-2'),
(2, '2016-03-21 12:35:15.000','EV-3'),
(2, '2016-03-21 12:35:15.000','EV-4'),
(2, '2016-03-21 12:40:20.000','EV-5'),
(3, '2016-03-21 12:40:50.000','EV-1'),
(3, '2016-03-21 12:41:25.000','EV-2'),
(3, '2016-03-21 12:41:25.000','EV-3'),
(3, '2016-03-21 12:42:13.000','EV-4'),
(3, '2016-03-21 12:47:35.000','EV-5')
;
WITH cteEvent AS
(
    SELECT ID, EventTime AS startTime,en.endTime
    FROM #Events e
    CROSS APPLY (
                    SELECT EventName,EventTime AS endTime 
                    FROM #Events e2 
                    WHERE e2.ID = e.id AND CAST(RIGHT(e2.eventname,1) AS INT) = 5) as en
    WHERE e.EventName = 'EV-1'
)
SELECT c.id,eventName,startTime,
    CASE 
        WHEN eventName = 'EV-1' 
        THEN NULL
        ELSE endTime
    END  AS endTime
FROM cteEvent c
LEFT JOIN #Events e ON c.id = e.id