Auswertung: Zeitinterval

Seven

Benutzer
Beiträge
5
Hi Leute,

ich bin gerade am verzweifeln.

Ich habe folgende Tabelle:

VertragsID --PLZ -- gültig_ab -- gültig_bis
1 -- 77777 -- 01.01.2010 -- 01.01.2017


etc.


Ich will jetzt AUF TAGESBASIS zählen wie viele Verträge aktiv sind pro PLZ.
--> gültig bis kann NULL sein
--> verträge die ab 02.01.2017 gültig sind, sollen NICHT in 01.012017 einfließen
--> verträge die nur bis 02.01.2017 gültig sind, sollen NUR in 01.01.2017 einfließen


Zeitraum >= 2017

D.h.

es sollte am schluss so aussehen:
Tag PLZ anzahl_verträge
01.01.2017 77777 5
02.01.2017 77777 4



Danke!
 
Werbung:
Im Prinzip simpel. Du brauchst eine Liste der dich interessierenden datumswerte. In PostgreSQL nutze ich dazu gern generate_series(). Damit joinst Du Deine Tabelle. Join-Condition ist, ob das Datum dieser Tabelle ziwschen den 2 Grenzen deiner Tabelle ist. In PostgreSQL nutze ich dazu ganz gerne Range-Typen und den Contains-Operator @>. Das ganze zum Schluß mit einem GROUP BY und ORDER BY passend würzen & abschmecken, fertig ist das Rezept.


Um es mal zu zeigen:

Code:
test=*# select * from seven ;
 id |  plz  |  ab  |  bis   
----+-------+------------+------------
  1 | 77777 | 2010-01-01 | 2017-01-01
  2 | 88888 | 2017-01-01 | 2018-01-01
  3 | 11111 | 2017-01-01 | 2017-02-01
  4 | 77777 | 2017-01-01 | 2017-01-05
  5 | 77777 | 2017-01-03 | 2017-01-08
(5 Zeilen)

test=*# select t.tag::date, s.plz, count(*) from generate_series('2017-01-01'::date,'2017-01-10','1day') t(tag) left join seven s on daterange(s.ab,s.bis,'[)') @> t.tag::date group by t.tag, s.plz order by t.tag, s.plz;
  tag  |  plz  | count
------------+-------+-------
 2017-01-01 | 11111 |  1
 2017-01-01 | 77777 |  1
 2017-01-01 | 88888 |  1
 2017-01-02 | 11111 |  1
 2017-01-02 | 77777 |  1
 2017-01-02 | 88888 |  1
 2017-01-03 | 11111 |  1
 2017-01-03 | 77777 |  2
 2017-01-03 | 88888 |  1
 2017-01-04 | 11111 |  1
 2017-01-04 | 77777 |  2
 2017-01-04 | 88888 |  1
 2017-01-05 | 11111 |  1
 2017-01-05 | 77777 |  1
 2017-01-05 | 88888 |  1
 2017-01-06 | 11111 |  1
 2017-01-06 | 77777 |  1
 2017-01-06 | 88888 |  1
 2017-01-07 | 11111 |  1
 2017-01-07 | 77777 |  1
 2017-01-07 | 88888 |  1
 2017-01-08 | 11111 |  1
 2017-01-08 | 88888 |  1
 2017-01-09 | 11111 |  1
 2017-01-09 | 88888 |  1
 2017-01-10 | 11111 |  1
 2017-01-10 | 88888 |  1
(27 Zeilen)

test=*#
 
Hi Danke für die Antwort.

Ich benutzte SYBASE IQ, da geht weder generate_series oder daterange :D

- Desweiteren, wie wird das dann mit denn gültig_bis = NULL gehandhabt?
 
Werbung:
- Desweiteren, wie wird das dann mit denn gültig_bis = NULL gehandhabt?

Code:
test=*# select current_date <@ '(2018-01-01,2018-04-01]'::daterange;
 ?column?
----------
 t
(1 Zeile)

test=*# select current_date <@ '(2018-01-01,]'::daterange;
 ?column?
----------
 t
(1 Zeile)

test=*#

Oberes Ende offen zählz wie unendlich.
 
Zurück
Oben