2013-01-11 13 views
5

私はMS SQL Serverで以下のようなテーブルを持っています。私は、各IDはどのくらいのために(0 =アクティブ)不活性であった時に見つける何をしたいのかグループごとの最小値と最大値とその他の条件

 id | Timestamp | active 
    -----+-----------+-------- 
     1 | 1:00 | 1 
     1 | 2:00 | 1 
     1 | 3:00 | 1 
     1 | 4:00 | 0 
     1 | 5:00 | 0 
     1 | 6:00 | 1 
     1 | 7:00 | 0 
     1 | 8:00 | 0 
     1 | 9:00 | 0 
     1 | 10:00 | 1 
     1 | 11:00 | 1 
     1 | 12:00 | 0 
     1 | 13:00 | 1 
     2 | 2:00 | 1 
     2 | 3:00 | 1 
     2 | 4:00 | 0 
     2 | 5:00 | 0 
     3 | 8:00 | 0 
     3 | 9:00 | 0 
     4 | 1:00 | 1 
     4 | 2:00 | 1 
     5 | 16:00 | 0 

。私がしようとしたのは、id = 0のときにidをグループ化し、最小時間と最大時間のdatediffを実行することでした。しかし、それは8時間(12:00〜4:00)@ 12:00にオフラインだったというid 1の結果になります。私が本当に欲しいのは、私に次の結果セットを与えるクエリです。

id | approx. offline in hours | at time 
    ---+--------------------------+----------- 
    1 |   1    | 5:00 
    1 |   2    | 9:00 
    1 |   0    | 12:00 
    2 |   1    | 5:00 
    3 |   0    | 9:00 
    5 |   0    | 16:00 

私が最初に試した間違ったクエリが

SELECT id as [Inactive], 
     DATEDIFF(hour, MIN(Timestamp), MAX(Timestamp)) as [approx. offline in hours], 
     MAX(Timestamp) as [at time] 
FROM table 
WHERE active = 0 
GROUP BY [Inactive] 

である。しかし、そのクエリでの問題は、それが間にアクティブな時間をスキップしていることです。私はTHISの質問にPARTITIONを使って尋ねられた質問を見てきましたが、問題が十分に異なっているように見えます。

何か助けていただければ幸いです。

+0

どのようなrdbmsを使用していますか? SQL Server、oracle? – Taryn

+0

@bluefeet大括弧は大体== SQL Server –

+0

@JoachimIsaksson私は同意しますが、彼らは使用しているrdbmsを述べるべきです。 – Taryn

答えて

3

これにアプローチする1つの方法は、どのデータベースでも機能し、相関サブクエリを使用することです。この考え方は、連続する各アクティブ値の文字列にグループ名を割り当てることです。特定のグループ名は、次に値が変化する時刻です。

select id, active, min(TimeStamp), max(TimeStamp) 
from (select t.*, 
      (select min(timeStamp) from t t2 where t2.id = t.id and t2.timeStamp > t.timeStamp and t2.active <> t.active 
      ) groupName 
     from t 
    ) t 
group by id, groupName, active 

ターンタイムスタンプをどのように取得するかは、データベースによって異なります。あなたはデータベースを指定しないので、私はそのロジックを追加させます。

また、特定のIDの最後のレコードが非アクティブの場合、グループ名はNULLです。それは問題ではない。

+0

IDの変更時にgroupNameがNULLになるので、この回答にバグがあると思います。 – Bulat

+0

@Bulat。 。 。それは問題ではない。グループ化にはNULLが有効で、idは 'group by'カラムに含まれます。 –

+0

はい、あなたが正しいです、それは問題ではありません。タイムスタンプの名前を、フィールド名を一貫させるための時間に変更したいだけかもしれません。 http://sqlfiddle.com/#!3/e5831/45/0 – Bulat

関連する問題