2012-08-30 36 views
0

下一行中設置等於值我有一個看起來像數據表如下:分組行和使用SQL

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的開始時間)。然後第二場比賽從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 
+1

請標籤添加到您的指定使用的具體rdbms的問題 –

+1

您可以使用光標來解決您的問題。 –

回答

0

您可以使用遊標一次獲取每行。

在拿:

  1. 從第一個讀取行
  2. 的事件名稱和開始時間從第一個讀取行的結束時間與diferent事件名稱(該行作爲下一個事件名稱和stattime以及) 。
  3. 將事件名稱,開始時間和結束時間插入#temptable

在最後,從#temptable中選擇行。

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 
3

正如有人使用光標是做一個很好的方式說 - 我有測試了這個並在表變量中提供了一個測試表。請把它放在查詢窗口中進行測試,用表名替換變量。

@events包含:

事件1 - 10:00

事件1 - 10:15

事件1 - 11:35

事件2 - 11:50

事件1 - 11:55

的輸出是:

事件1 10:00 11:50

事件2 11:50 11:55

事件1個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 Fiddle