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 OClock で開始され、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

出力は次のとおりです。

イベント 1 10:00 11:50

イベント 2 11:50 11:55

イベント 1 11:55 ヌル

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

興味深い質問: 私はテストしていませんが、これは機能するはずです (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 に答える
0

カーソルを使用して、一度に各行をフェッチできます。

フェッチ中:

  1. 最初にフェッチされた行からイベント名と開始時刻を取得します
  2. 異なるイベント名を持つ最初にフェッチされた行から終了時間を取得します (この行は次のイベント名および統計時間としても)。
  3. イベント名、開始時刻、終了時刻を に挿入し#temptableます。

最後に、 から行を選択します#temptable

于 2012-08-30T14:14:45.520 に答える