正如有人使用光標是做一個很好的方式說 - 我有測試了這個並在表變量中提供了一個測試表。請把它放在查詢窗口中進行測試,用表名替換變量。
@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
請標籤添加到您的指定使用的具體rdbms的問題 –
您可以使用光標來解決您的問題。 –