2017-08-03 32 views
2

下面是一個簡單的數據集:TSQL選擇分鐘日期在where子句中

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 

結果預計:

1 60 
2 120 

我們要計算的持續時間的總和時狀態不這樣做如果狀態爲「正在進行」,則只將持續時間作爲最早的日期。

下面是該查詢我嘗試:

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在這裏。 –