2015-09-25 43 views
0

我有一個簡單的表之間的時間:值以前X行基於行

ID--- CreateDate --- Value 

1 --- 2015-09-25 10:00 --- 1 
1 --- 2015-09-25 10:30 --- 2 
1 --- 2015-09-25 11:00 --- 3 
1 --- 2015-09-25 11:30 --- 2 
1 --- 2015-09-25 12:00 --- 1 
2 --- 2015-09-25 10:00 --- 2 
2 --- 2015-09-25 10:30 --- 3 
2 --- 2015-09-25 11:00 --- 3 
2 --- 2015-09-25 11:30 --- 3 
2 --- 2015-09-25 12:00 --- 2 

我需要找到在該值高於2 1.5小時以上的特定的時間IE中的數據序列24小時。如果我可以確定每個測量點(每個ID的行)恰好以30分鐘的時間間隔出現,這不會成爲問題。

然後,使用窗口功能,我的結果會是什麼樣子

2 --- 2015-09-25 10:30 --- 3 
2 --- 2015-09-25 11:00 --- 3 
2 --- 2015-09-25 11:30 --- 3 

的問題是 - 一些ID將產生兩倍多行(有的甚至更多)。就像這樣:

1 --- 2015-09-25 10:00 --- 1 
1 --- 2015-09-25 10:30 --- 3 
1 --- 2015-09-25 11:00 --- 3 
1 --- 2015-09-25 11:30 --- 3 
1 --- 2015-09-25 12:00 --- 1 
2 --- 2015-09-25 10:00 --- 1 
2 --- 2015-09-25 10:15 --- 2 
2 --- 2015-09-25 10:30 --- 3 
2 --- 2015-09-25 10:45 --- 3 
2 --- 2015-09-25 11:00 --- 3 
2 --- 2015-09-25 11:15 --- 3 
2 --- 2015-09-25 11:30 --- 3 
2 --- 2015-09-25 11:45 --- 2 
2 --- 2015-09-25 12:00 --- 2 

在這種情況下,我想我的結果是這樣的:

1 --- 2015-09-25 10:30 --- 3 
1 --- 2015-09-25 11:00 --- 3 
1 --- 2015-09-25 11:30 --- 3 
2 --- 2015-09-25 10:30 --- 3 
2 --- 2015-09-25 10:45 --- 3 
2 --- 2015-09-25 11:00 --- 3 
2 --- 2015-09-25 11:15 --- 3 
2 --- 2015-09-25 11:30 --- 3 

但是,據我所知,窗口功能,不支持時間/列基於參數。那麼當我不能「計數」特定數量的行時,我有什麼選擇?

我願意接受建議的替代品使用SQL Server,表結構,什麼:)

+1

也許我今天早上有點笨,但我不明白你的問題,所以我試着看看我是否理解: 你需要所有的記錄,其中價值高於X和日期和時間在兩個值之間?或者是別的什麼? –

回答

1

這是一個類型的差距,和島嶼問題。需要識別與相鄰序列的基團與一個值大於2的一個方法是使用行數的差:

select t.* 
from (select t.*, max(value) over (partition by id, grp) as maxvalue, 
      count(*) over (partition by id, grp) as cnt 
     from (select t.*, 
        (row_number() over (partition by id order by createdate) - 
        row_number() over (partition by id, (case when value > 2 then 1 else 0 end) 
             order by createdate) 
        ) as grp 
      from table t 
      ) t 
    ) t 
where cnt >= 3 and maxvalue > 2 

查詢然後計算每個組和值中的數量,選擇的那些具有至少3個長度的較大值和序列。注意:您可以獲得最小和最大時間,並檢查至少1.5小時的差異。然而,三段的順序似乎符合你的條件。