按 isoweek 分组 - postgresql

Group by isoweek - postgresql

这是一个基于上一个问题的子问题:

问题是如何按等周分组

CREATE TABLE task
    (id int4, start date, stop date, hr int4);    
INSERT INTO task
    (id, start, stop, hr)
VALUES
    (1, '2017-01-01','2017-01-31', 80),
    (2, '2017-01-01','2017-02-28', 120);

根据帕特里克的回答,我找到了这个解决方案:

SELECT id,to_char(iso, 'iyyy-iw'),(hr/weeks)::numeric (5,2) as hr_week 
FROM (SELECT id,hr,generate_series(start,stop,interval '1 week') as iso, 
(stop - start)/7 as weeks FROM task) as sub

http://sqlfiddle.com/#!15/93ee1/78

下一步是 "group the groups" 像这样:

2016-52 35
2017-01 35
2017-02 35
2017-03 35
2017-04 35
2017-05 15
2017-06 15
2017-07 15
2017-08 15

我不知道该怎么做。任何帮助表示赞赏。

TIA,

SQL Fiddle

PostgreSQL 9.3 架构设置:

CREATE TABLE task
    (id int4, start date, stop date, hr int4);    
INSERT INTO task
    (id, start, stop, hr)
VALUES
    (1, '2017-01-01','2017-01-31', 80),
    (2, '2017-01-01','2017-02-28', 120);

查询 1:

SELECT
     to_char(iso, 'iyyy-iw')  as YYY_WK
   , max(weeks) as weeks
   , sum((hr/weeks)::numeric (5,2)) as hr_week 
FROM (
    SELECT
       id
     , hr
     , generate_series(start,stop,interval '1 week') as iso
     , (stop - start)/7 as weeks 
    FROM task
    ) as sub
group by
     to_char(iso, 'iyyy-iw')

Results:

|  yyy_wk | weeks | hr_week |
|---------|-------|---------|
| 2017-08 |     8 |      15 |
| 2017-06 |     8 |      15 |
| 2017-02 |     8 |      35 |
| 2017-03 |     8 |      35 |
| 2017-07 |     8 |      15 |
| 2016-52 |     8 |      35 |
| 2017-05 |     8 |      15 |
| 2017-01 |     8 |      35 |
| 2017-04 |     8 |      35 |

同时我找到了另一个基于cte的解决方案。然而,这不包括空周,但也是一种解决方案。我会考虑@used-by-already 作为更可靠的答案。

WITH list as (
SELECT id,to_char(iso, 'iyyy-iw'),(hr/weeks)::numeric (5,2) as hr_week 
FROM (SELECT id,hr,generate_series(start,stop,interval '1 week') as iso, 
(stop - start)/7 as weeks FROM task) as sub)

SELECT DISTINCT ON (week) week, sum(hr_week) 
FROM list 
GROUP BY 1

http://sqlfiddle.com/#!15/93ee1/113