2017-10-11 57 views
0

我具有以下表稱爲「項目」:減去行

CREATE TABLE Projects (Task_ID integer, Start_Date date, End_Date date) 

INSERT INTO Projects VALUES 
(1, '2015-10-01', '2015-10-02'), 
(2, '2015-10-02', '2015-10-03'), 
(3, '2015-10-03', '2015-10-04'), 
(4, '2015-10-13', '2015-10-14'), 
(5, '2015-10-14', '2015-10-15'), 
(6, '2015-10-28', '2015-10-29'), 
(7, '2015-10-30', '2015-10-31') 

它保證了END_DATE和START_DATE之間的差是等於1天表中的每一行。如果任務的End_Date是連續的,那麼它們是同一項目的一部分。我需要編寫一個查詢來輸出項目的開始日期和結束日期,並按升序排列完成項目的天數列出。如果有多個項目的完成日數相同,則應在項目的開始日期之前訂購。

回答

0

這裏是解決方案:

WITH results AS 
(
SELECT p.*, 
     extract('doy' 
FROM p.start_date) AS start_Doy, 
    extract('doy' 
FROM p.end_date) AS end_Doy, 
    ROW_NUMBER() OVER(PARTITION BY COUNT(*) 
ORDER BY p.end_date) AS row_num, 
     extract('doy' 
FROM p.end_date) -(ROW_NUMBER() OVER(PARTITION BY COUNT(*) 
ORDER BY p.end_date)) AS DIFF 
FROM Projects p 
GROUP BY p.task_id, 
     p.start_date, 
     p.end_date 
ORDER BY p.end_date) 
SELECT MIN(r.start_date) AS "Project Start Date", 
     MAX(r.end_date) AS "Project End Date", 
     (MAX(r.end_doy) - MIN(r.start_doy)) AS "Project Duration" 
FROM results r 
Group BY r.diff 
ORDER BY "Project Duration", 
     "Project Start Date"