2017-06-17 3 views
0

ist eine Teilfrage auf der Grundlage einer vorherigen Frage:Gruppe von isoweek - Das postgresql

Split values from an interval and group by isoweek - Postgresql

Die Frage ist, wie man Gruppe dies durch isoweek

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); 

Basierend auf Patricks Antwort, die ich diese gefunden Lösung:

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

Der nächste Schritt ist die „Gruppe die Gruppen“ wie folgt aus:

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 

Ich kann nicht herausfinden, wie dies zu tun. Jede Hilfe wird geschätzt.

TIA,

Antwort

1

SQL Fiddle

PostgreSQL 9.3 Schema Einrichtung:

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); 

Abfrage 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 | 
+0

Ich hoffe, dass dies auch leer Wochen decken. Vielen Dank! – sibert

0

Inzwischen finde ich eine andere Lösung, basierend auf CTE. Dies deckt jedoch nicht leere Wochen ab, sondern ist auch eine Lösung. Ich werde @ used-by-always als eine zuverlässigere Antwort betrachten.

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

Verwandte Themen