5

MS SQL Server に以下のようなテーブルがあります。

      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)であったかを調べることです。私がやろうとしたのは、アクティブ = 0 のときに ID でグループ化し、最小時間と最大時間で datediff を実行することでした。しかし、それは 12:00 で 8 時間 (12:00 - 4: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]

しかし、そのクエリの問題は、アクティブな時間をスキップすることです。PARTITIONを使用して尋ねられ、回答されたこの質問を見てきましたが、質問が十分に異なっており、回答が質問に固有すぎて意味がわかりません。

どんな助けでも大歓迎です。

4

1 に答える 1

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

タイムスタンプを期間に変換する方法はデータベースによって異なりますが、注意点が1つあります。データベースを指定しないので、そのロジックを追加します。

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

于 2013-01-11T16:50:25.303 に答える