0

我有一个如下所示的数据表:

ID |   EventName   |     StartTime      |     EndTime     |
 1       Event1      2012-08-08 10:00:00         ???
 2       Event1      2012-08-08 10:15:00         ???
 3       Event1      2012-08-08 11:35:00         ???
 4       Event2      2012-08-08 11:50:00         ???
 5       Event2      2012-08-08 12:05:00         ???
 6       Event1      2012-08-08 12:23:00         ???
 7       Event1      2012-08-08 12:40:00         ???
 8       Event2      2012-08-08 13:47:00         ???

该数据旨在显示事件 1 从 10 点开始,一直运行到 11:50(事件 2 的开始时间)。事件 2 然后从 11:50 运行到 12:23,此时事件 1 再次启动。

我想将相同事件的块分组并将事件的结束时间设置为下一个事件的开始时间。结果表应如下所示:

EventName   |        StartTime         |        EndTime        |
 Event1         2012-08-08 10:00:00        2012-08-08 11:50:00 
 Event2         2012-08-08 11:50:00        2012-08-08 12:23:00
 Event1         2012-08-08 12:23:00        2012-08-08 13:47:00
 Event2         2012-08-08 13:47:00        NULL
4

3 回答 3

3

正如有人所说,使用游标是一种很好的方法——我已经对此进行了测试,并在表变量中提供了一个测试表。请把它放在一个查询窗口中并测试它,用你的表名替换变量。

@Events 包含:

活动 1 - 10:00

活动 1 - 10:15

活动 1 - 11:35

活动 2 - 11:50

活动 1 - 11:55

输出是:

活动一 10:00 11:50

活动二 11:50 11:55

活动一 11:55 NULL

DECLARE @Events AS TABLE
    (
      ID INT IDENTITY(1, 1) ,
      EventName VARCHAR(50) ,
      StartTime DATETIME ,
      EndTime DATETIME
    )

INSERT  INTO @Events
        ( EventName ,
          StartTime ,
          EndTime
        )
VALUES  ( 'Event1' ,
          '2012-08-08 10:00:00' ,
          NULL  
        )
INSERT  INTO @Events
        ( EventName ,
          StartTime ,
          EndTime
        )
VALUES  ( 'Event1' ,
          '2012-08-08 10:15:00' ,
          NULL  
        )
INSERT  INTO @Events
        ( EventName ,
          StartTime ,
          EndTime
        )
VALUES  ( 'Event1' ,
          '2012-08-08 11:35:00' ,
          NULL  
        )
INSERT  INTO @Events
        ( EventName ,
          StartTime ,
          EndTime
        )
VALUES  ( 'Event2' ,
          '2012-08-08 11:50:00' ,
          NULL  
        )
        INSERT  INTO @Events
        ( EventName ,
          StartTime ,
          EndTime
        )
VALUES  ( 'Event1' ,
          '2012-08-08 11:55:00' ,
          NULL  
        )
DECLARE @CurrentEvent AS VARCHAR(100) ,
    @CurrentStartTime AS DATETIME ,
    @EndTime AS DATETIME ,
    @CursorEvent AS VARCHAR(100) ,
    @EventsToDelete AS INT
SET @EventsToDelete = ( SELECT  COUNT(*)
                        FROM    @Events
                      )
SELECT TOP 1
        @CurrentEvent = EventName ,
        @CurrentStartTime = StartTime
FROM    @Events
DECLARE EventsCursor CURSOR
FOR
    SELECT  EventName ,
            StartTime
    FROM    @Events
    ORDER BY EndTime ASC
OPEN EventsCursor
FETCH NEXT FROM EventsCursor INTO @CursorEvent, @EndTime
WHILE @@FETCH_STATUS = 0 
    BEGIN
        IF NOT @CursorEvent = @CurrentEvent 
            BEGIN
                INSERT  INTO @Events
                        ( EventName ,
                          StartTime ,
                          EndTime
                        )
                VALUES  ( @CurrentEvent ,
                          @CurrentStartTime ,
                          @EndTime  
                        )
                SET @CurrentEvent = @CursorEvent
                SET @CurrentStartTime = @EndTime
            END
           FETCH NEXT FROM EventsCursor INTO @CursorEvent, @EndTime 
    END
CLOSE EventsCursor
DEALLOCATE EventsCursor

DELETE  FROM @Events
WHERE   ID < @EventsToDelete

SELECT * FROM @Events ORDER BY StartTime

SQL小提琴

于 2012-08-30T14:57:15.417 回答
0

您可以使用游标一次获取每一行。

获取时:

  1. 从第一行获取事件名称和开始时间
  2. 从具有不同事件名称的第一行获取结束时间(该行也是下一个事件名称和统计时间)。
  3. 将事件名称、开始时间和结束时间插入#temptable.

在最后,从#temptable.

于 2012-08-30T14:14:45.520 回答
0

有趣的问题:虽然我没有测试过,但这应该可以工作(EventsTable 是表的名称)

   select eventname,starttime,endtime
   from(
    select first.eventname eventname , min(second.starttime,first.starttime) starttime,                 second.eventname secondevent,first.starttime endtime
    from eventstable first, eventstable second where first.id=(second.id-1)
    ) where eventname != secondevent
于 2012-08-30T14:38:03.410 回答