2017-08-03 16 views
2

は、サンプルデータセットですにおける分日時:TSQL選択ここ句

1 60 
2 120 

私たちは、持続時間の合計を計算したい状況が行われていない場合:期待

ID DATE  STATUS  DURATIONTIME 
1 30-08-2017 Done   220 
1 30-08-2017 In progress 100 
1 29-08-2017 In progress 50 
1 28-08-2017 New   10 
2 30-08-2017 Done   200 
2 30-08-2017 In progress 100 
2 29-08-2017 In progress 60 
2 29-08-2017 New   50 
2 28-08-2017 New   10 

結果ステータスが進行中の場合は、最も早い日付の期間のみを取る。ここで

は私がしようとクエリです:

SELECT  ID, SUM(DURATIONTIME) 
FROM   MYDB 
WHERE   STATUS <> 'Done' 
      AND DURATIONTIME = CASE 
       WHEN (STATUS = 'In progress' AND DATE <> min(DATE)) 
       THEN 0 
       ELSE DURATIONTIME END 
GROUP BY ID ASC 

しかし、クエリが失敗した...この問合せをリライトする方法任意のアイデアを?

答えて

3

使用DENSE_RANKウィンドウ関数

SELECT ID, 
     Sum(DURATIONTIME) 
FROM (SELECT DENSE_RANK()OVER(partition BY ID, Status ORDER BY DATE asc) Rn,* 
     FROM yourtable 
     WHERE Status in ('New','In progress')) a 
WHERE (Rn = 1 and Status = 'In progress') or Status = 'New' 
GROUP BY ID 
+0

それは他のステータスは、同じIDで複数の行を持つことができるので、私はデータセット –

+0

を編集します動作しません@ VincentTeyssier - あなたは 'DENSE_RANK'が必要です..更新されました –

+0

しかし他のステータスのDURATIONTIMEはカウントされません。 –