2017-10-11 60 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"