2014-02-18 17 views
1

我有一個SQL數據庫,像這樣:基於可變時間戳記錄如何對數據進行分區 - SQL

Id Text  DateTime 
---------------------------- 
1  Event1  1/1/1900 12:00:00 
2  Event2  1/1/1900 12:10:11 
3  Event3  1/1/1900 12:11:10 
4  Event2  1/1/1900 12:12:12 
5  Event3  1/1/1900 12:13:19 
6  Event1  1/1/1900 12:14:22 
7  Event2  1/1/1900 12:15:15 
8  Event2  1/1/1900 12:18:16 
9  Event3  1/1/1900 12:23:00 
10 Event3  1/1/1900 12:24:11 

我想找到該事件的第一發生,由事件1 occurence分區。即哪個事件2在任何其他事件2之前發生,但在事件1之後發生。

到目前爲止,我有這樣的:

SELECT t1.* from Database t1 join 
(select ROW_NUMBER() OVER 
(PARTITION BY Text ORDER BY DateTime ASC) AS Ranking, 
Id from Database 
where DateTime>(select MAX(DateTime) from Database where Text = 'Event1')) t2 
on t1.id=t2.id and t2.Ranking=1 

這隻適用於,雖然最後事件(因爲我使用MAX)。有沒有一些聰明的方法可以做到這一點,我只是看不到?澄清,我想所有事件(包括事件1與否,無所謂),如果他們是事件1發生後發生的第一種類型,將被標記。

在這種情況下,輸出將類似於:

Id 
--- 
2 
3 
7 
9 

Id 
--- 
1 
2 
3 
6 
7 
9 
+0

您可以品嚐輸出添加到您的問題嗎? –

回答

0

我正在修改你的Row_Number()。我將它設置爲 我的邏輯的新分區ID。請包涵。這裏我將使用Cursor, 爲每個Event1,2,3下一個Event1,2,3等創建一個分區 ,因爲沒有其他的可能性來使用分區。

DECLARE @ROW INT=0, 
     @TEXT VARCHAR(10), 
     @DATETIME DATETIME, 
     @TMPDATE DATETIME, 
     @CUR CURSOR 

     SET @CUR = CURSOR FOR SELECT #TABLE.Text [Text],#TABLE.[DateTime] FROM #TABLE 
        ORDER BY [DateTime] 

     OPEN @CUR   
      FETCH NEXT FROM @CUR INTO @TEXT,@DATETIME 
      WHILE @@FETCH_STATUS = 0 
      BEGIN 

       IF(@TEXT='Event1') 
       BEGIN 

        SET @[email protected]+1; 

       END 

       UPDATE #TABLE SET [email protected] WHERE [Text][email protected] AND [DateTime][email protected]; 

       FETCH NEXT FROM @CUR INTO @TEXT,@DATETIME  
      END 

     CLOSE @CUR 
     DEALLOCATE @CUR 

現在我要去分區accoring的標識和文字得到 最小日期時間

 SELECT DISTINCT ID,[TEXT] 
     ,CASE WHEN [TEXT]= 'EVENT1' THEN [DateTime] ELSE MIND END [DATETIME]   
     FROM 
     (
      SELECT ID,[Text],[DateTime] 
      ,MIN([DATETIME]) OVER(PARTITION BY ID,[Text]) MIND 
      FROM #TABLE 
     )TAB 
     ORDER BY [DATETIME] 
0

如果第一Event2總是由Event1之前,你可以使用:

WITH cte AS (SELECT *,ROW_NUMBER() OVER (ORDER BY DateTime) RN 
      FROM Table1) 
SELECT b.* 
FROM cte a 
JOIN cte b 
ON a.text = 'event1' and b.text = 'event2' 
AND a.RN = b.RN - 1 

演示:SQL Fiddle

相關問題