2017-01-09 3 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

最終画像は3黄色のマークとの最初のグループを表示します。私は、これは、連続したグループ化と標準のトリックである1

+0

私の誤植を修正してくれたGuidoGに感謝します。私の悪い! – Christian

答えて

1

テーブルからすべての有効なグループを選択することができますビューまたはSQLクエリを必要とする:

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

データの "島"。 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

関連する問題