Datum in Woche umwandeln

davidos

Neuer Benutzer
Beiträge
1
Hallo,
ich hab eine Liste die ungefähr so aussieht:

ID DATUM NUMMER

1 01.01.2001 1821
2 02.01.2001 1143
3 03.01.2021 1151
4 04.01.2021 1166
... ... ...

ich möchte es gerne in Wochenschritten (7 Tage) ausgeben lassen. Ungefähr so:

ID WOCHE Summe NUMMER pro WOCHE

1 01.01.2001 - 07.01.2001 8943
2 08.01.2001 - 14.01.2001 8589
... ... ...
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.731
Dein Beispiel ist ungünstig, weil es schon mal in sich selbst nicht valide ist (die Summen stimmen nicht). Dazu kommt die Definition der Woche, die Du nicht beachtest:

Code:
week

The number of the ISO 8601 week-numbering week of the year. By definition, ISO weeks start on Mondays and the first week of a year contains January 4 of that year. In other words, the first Thursday of a year is in week 1 of that year.

In the ISO week-numbering system, it is possible for early-January dates to be part of the 52nd or 53rd week of the previous year, and for late-December dates to be part of the first week of the next year. For example, 2005-01-01 is part of the 53rd week of year 2004, and 2006-01-01 is part of the 52nd week of year 2005, while 2012-12-31 is part of the first week of 2013. It's recommended to use the isoyear field together with week to get consistent results.


Folgender Ansatz ist nicht perfekt, weil nicht ganz korrekt, der Jahreswehcsel ist nicht korrekt beachtet bei der Berechnung der Start- und Enddaten und der Sortierung. Ist auch nicht mit SQLlite gemacht, daher versichte ich jetzt drauf, das zu perfektionieren:

Code:
edb=*# select * from davidos;
 id |        datum        | nummer
----+---------------------+--------
  1 | 2001-01-01 00:00:00 |   1821
  2 | 2001-01-02 00:00:00 |   1143
  3 | 2021-01-03 00:00:00 |   1151
  4 | 2021-01-04 00:00:00 |   1156
(4 rows)

edb=*# with foo as (select *, extract(year from datum) y, extract(week from datum) w from davidos) select datum - (extract(dow from datum) -1) *'1day'::interval as week_start, datum - (extract(dow from datum)-1) * '1day'::interval + '6day'::interval as week_end, y,w, sum(nummer) from foo group by 1,2,y,w order by y,w;
     week_start      |      week_end       |  y   | w  | sum  
---------------------+---------------------+------+----+------
 2001-01-01 00:00:00 | 2001-01-07 00:00:00 | 2001 |  1 | 2964
 2021-01-04 00:00:00 | 2021-01-10 00:00:00 | 2021 |  1 | 1156
 2021-01-04 00:00:00 | 2021-01-10 00:00:00 | 2021 | 53 | 1151
(3 rows)

edb=*#
 
Werbung:

dabadepdu

Datenbank-Guru
Beiträge
1.050
Wenn ich mich nicht vertu, dann ist für das Jahr 2001 die KW 1 vom 1.-7. Januar..
Ich verstehe aber die ID bei dem Wunschoutput nicht, kann jedenfalls nicht aus den Daten stammen
Die einfachste Lösung wäre m.E.:
Code:
select min(datum), max(datum), sum(nummer) from weekdata
 group by strftime( '%W', datum ) ;
Das bringt Dich aber in Teufelsküche, wenn die Daten nicht für jeden Tag vorhanden sind. Dann springen die Werte eben gemäß der vorhanden Daten.
Um echte Wochenanfangs- und -Enddatums zu bekommen, müsste man die KW wieder auf das jeweilige Datum im Jahr umrechnen.
 
Oben