2017-01-09 164 views
0

行選擇多組,我不知道如何標題這個問題,但我盡力了。我使用SQL Server有一些疑問小的挑戰2016從SQL Server結果

我有一個表許多行和全部都有時間戳列。根據列Lane_0的值(值0或1),我需要從日期時間列中獲取時間戳。

表看起來是這樣的:

enter image description here

行的組標有黃色。

基本上,表格是要跟蹤什麼時候開啓或關閉。 1 =開,0 =關。我需要找出每個組關閉時間(值爲0)的時間以及該組最舊和最新的時間戳。一個組是Lane_0中0行的集合。

從圖片中,我將不得不獲得Row_num 7,8和9,然後從行7中的時間戳減去行9中的date_time以獲得持續時間。最後,我需要ROW_NUM 7和9

結果選擇DATE_TIME應該是這個樣子:

enter image description here

最後一張圖片顯示的三個黃色標記的第一組。我需要從表中選擇的所有有效組視圖或SQL查詢1.

+0

感謝GuidoG糾正我的錯誤!我的錯! – Christian

回答

1

這是一個標準的招用連續的分組:

DECLARE @t TABLE 
    (
     rn INT , 
     dt DATETIME , 
     ln INT 
    ) 
INSERT INTO @t 
VALUES (5, GETDATE(), 1), 
     (6, GETDATE(), 1), 
     (7, GETDATE(), 0), 
     (8, GETDATE(), 0), 
     (9, DATEADD(ss, 15, GETDATE()), 0), 
     (10, GETDATE(), 1), 
     (11, GETDATE(), 1), 
     (12, GETDATE(), 0), 
     (13, DATEADD(ss, 6, GETDATE()), 0), 
     (14, GETDATE(), 1); 


WITH cte 
      AS (SELECT * , 
         ROW_NUMBER() OVER (ORDER BY rn) 
         - ROW_NUMBER() OVER (ORDER BY ln, rn) r 
       FROM  @t 
      ) 
    SELECT MIN(dt) , 
      MAX(dt) , 
      DATEDIFF(ss, MIN(dt), MAX(dt)) 
    FROM cte 
    WHERE ln = 0 
    GROUP BY r 

輸出:

2017-01-09 15:47:31.560  2017-01-09 15:47:46.560 15 
2017-01-09 15:47:31.560  2017-01-09 15:47:37.560 6 
+0

我永遠都不會猜到:D很棒的幫助!將盡快測試它。如果你能爲我提供一些關於這個問題的好文章/博客,那麼我會非常感激。 – Christian

+1

https://www.simple-talk.com/sql/t-sql-programming/the-sql-of-gaps-and-islands-in-sequences/ –

1

您需要確定數據中的「島嶼」。一種方法使用行號的差異:

select lane_no, min(datetime), max(datetime), count(*), 
     datediff(second, min(datetime), max(datetime)) as dur_second, 
     datediff(second, min(datetime), max(datetime))/60.0 as dur_minute 
from (select t.*, 
      row_number() over (partition by lane_no order by date_time) as seqnum_l, 
      row_number() over (order by date_time) as seqnum 
     from t 
    ) t 
where lane_no = 0 
group by lane_no, (seqnum - seqnum_l); 
+0

有點不同的解決方案Giorgi Nakeuri在下面提出的/以上。結果會一樣嗎? – Christian