2016-11-14 3 views
0

私は現在、私が持っている問題を解決しようとしています。私は、STATE 2 例、オブジェクトAのオブジェクトの過去のこと日数のカウントを返すSQLを記述STATE 2 + 02-02で04-02 10から02まで滞在する必要があるCount day SQL Server

| ID | Op | Object | STATE | Timestamp | 
    | 01 | 1 | A  | 1 | 01-02-2016| 
    | 02 | 1 | A  | 2 | 04-02-2016| 
    | 03 | 1 | A  | 1 | 10-02-2016| 
    | 04 | 1 | A  | 3 | 01-02-2016| 
    | 05 | 2 | A  | 2 | 02-02-2016| 
    | 06 | 3 | A  | 1 | 05-02-2016| 
    | 07 | 3 | A  | 2 | 10-11-2016| 

05-02に、10-11から今日まで6日+ 3日+ 4日です。

SQL return 13 

現在、コードで作成していますが、SQL抽出に必要です。どのように処理するのか分かりません。 SQLで可能ですか?あなたが外selectにフィルタリング条件を移動させることができ、

select object, 
     sum(case when state = 2 then datediff(day, timestamp, coalesce(next_timestamp, getdate())) 
       else 0 
      end) as days_state_2 
from (select t.*, 
      lead(timestamp) over (partition by object order by timestamp) as next_timestamp 
     from t 
    ) t 
group by object; 

または::

は、私はあなたが集約と日付ロジックと一緒にlead()をしたいと思います

+0

私はこの表を理解していません。 01-02-2016オブジェクトAは状態1(レコード01)と状態3(レコード04)に切り替えましたか? 02-02-2016から03-02-2016までは状態1(レコード01から)と状態2(レコード05から)でした。 04-02-2016に状態2が2回(レコード05と02から)、05-02-2016に状態2(レコード02から)と状態1(レコード06から)がありました。したがって、オブジェクトには複数の状態があり、IDで順序付けして重複する日付範囲を調べることによって、どの状態をいくつの状態だけで判断できますか? –

答えて

1

ありがとう

select object, 
     sum(datediff(day, timestamp, coalesce(next_timestamp, getdate()))) as days_state_2 
from (select t.*, 
      lead(timestamp) over (partition by object order by timestamp) as next_timestamp 
     from t 
    ) t 
where state = 2 
group by object; 
+1

ありがとう、あなたはLead()について知らなかったし、うまくいきます。 – BerithBE

1
select object, 
     sum(datediff(day, timestamp, coalesce(next_timestamp, getdate()))) as days_state_2 
from (select *, 
      lead(timestamp) over (partition by object order by timestamp) as next_timestamp 
     from #b 
    ) t 
where state = 2 
group by object; 
+0

ありがとう、あなたはLead()について知らなかったし、正常に動作します。 – BerithBE