Lücken füllen

Hallo,

ich bin neu hier, also büdde nicht so hart zu mir sein ^^.

Irgendwie find ich nichts im Internet darüber, deswegen frag ich mal hier, ob mir jemand weiterhelfen kann. Sitze bestimmt schon n paar Stündchen an dem Problem.

Also: Gewisse Ereignisse sind über einen Zeitraum von ein paar Jahren geschehen. Diese sind per date in der Datenbank abgespeichert. Mein Problem ist, dass ich alle Ereignisse in dem jeweiligen Quartal anzeigen muss. Allerdings kann es auch vorkommen, dass gar kein Ereignis in einem Quartal stattgefunden hat. Wie kann ich es realisieren, dass auch die “leeren” Quartale angezeigt werden können? mit 0 oder so.
Für Tage hab ich es schon gefunden, wobei es da auch nur um die Anzeige aller Tage ging und nicht um die Verbindungen zwischen Zeit zu Ereignissen.

Besten Dank schonmal ^^

Mal als Anregung:

test=# create table ereignisse (datum date, ereigniss text);
CREATE TABLE
test=*# insert into ereignisse values ('2008-01-01'::date, 'Prost Neujahr!');
INSERT 0 1
test=*# insert into ereignisse values ('2008-07-28'::date, 'begin Elternzeit');
INSERT 0 1
test=*# select quartal, ereigniss from ereignisse right join generate_series(1,4) quartal on (extract('quarter' from datum)=quartal);
 quartal |    ereigniss
---------+------------------
       1 | Prost Neujahr!
       2 |
       3 | begin Elternzeit
       4 |
(4 rows)

Natürlich ist das so noch falsch, weil es das Jahr nicht berücksichtigt. Das überlasse ich Dir zur Übung.


Andreas

besten Dank für die schnelle antwort.

Aber ich hab mich wohl nicht ganz richtig ausgedrückt ^^. Also ich hab unterschiedliche Datenbanken und der Start und Entzeitpunkt sind variabel.

Außerdem kann generate_series() ja nur int annehmen und date - date ergibt zwar int, aber die Anzahl der Tage.

Oder geht das doch mit deinem Befehl?

Vielleicht haben wir uns in der Tat nicht wirklich verstanden. Das könntest Du ändern, indem Du Dein Problem mal im Detail schilderst:

  • Tabellenaufbau
  • Beispieldaten
  • erwartetes Resultat


Außerdem kann generate_series() ja nur int annehmen und date - date ergibt zwar int, aber die Anzahl der Tage.

Und was ist da das Problem?


Oder geht das doch mit deinem Befehl?


test=*# select * from ereignisse ;
   datum    |      ereigniss
------------+---------------------
 2008-01-01 | Prost Neujahr!
 2008-07-28 | begin Elternzeit
 2009-01-01 | Prost Neujahr 2009!
(3 rows)

test=*# select * from (select extract(year from q) as jahr, extract(quarter from q)  as quartal from (select '2007-01-01'::date+s*'3month'::interval as q from generate_Series(0,11)s)foo) bla left join ereignisse on ((jahr, quartal)=(extract(year from datum),extract(quarter from datum))) order by 1,2;
 jahr | quartal |   datum    |      ereigniss
------+---------+------------+---------------------
 2007 |       1 |            |
 2007 |       2 |            |
 2007 |       3 |            |
 2007 |       4 |            |
 2008 |       1 | 2008-01-01 | Prost Neujahr!
 2008 |       2 |            |
 2008 |       3 | 2008-07-28 | begin Elternzeit
 2008 |       4 |            |
 2009 |       1 | 2009-01-01 | Prost Neujahr 2009!
 2009 |       2 |            |
 2009 |       3 |            |
 2009 |       4 |            |
(12 rows)

Falls ich Dich korrekt verstanden habe (dabei bin ich mir aber nicht sicher), hast Du eine Tabelle wie mein erstes Select zeigt und erwartest ein Resultat, wie es das zweite zeigt.

Andreas

Du bist n Guru ^^ positivGemeint

Das einzige, was jetzt noch nicht stimmt, ist,dass ich das älteste und jüngste (kann auch in der Zukunft liegen) Datum als Referenz nehmen muss. Also ich weisst nicht genau, ab wann das älteste Datum und wann das jüngste Datum ist.

Ach, und die Ereignisse und Daten dazu müssen nicht extra angegeben werden. Da reicht ein count für jedes Quartal.

Besten Dank :wink:

Vereinfachtes Beispiel:

test=*# create table jahre (jahr int);
CREATE TABLE
Zeit: 0,866 ms
test=*# insert into jahre values (100);
INSERT 0 1
Zeit: 0,437 ms
test=*# insert into jahre values (105);
INSERT 0 1
Zeit: 0,257 ms
test=*# insert into jahre values (110);
INSERT 0 1
Zeit: 0,293 ms
test=*# select generate_series((select min(jahr) from jahre), (select max(jahr) from jahre));
 generate_series
-----------------
             100
             101
             102
             103
             104
             105
             106
             107
             108
             109
             110
(11 Zeilen)



Ach, und die Ereignisse und Daten dazu müssen nicht extra angegeben werden. Da reicht ein count für jedes Quartal.

Besten Dank > :wink: >

Wer oder was hindert Dich am count() und group by?

Andreas

das mit group by und count wollte ich einfach nur erwähnt haben ^^.

hmm, aber wenn ich das absolute Datum gegen:

(SELECT min(to_date(ereignis, ‘dd.mm.YYYY’) FROM tabelle))

austausche, bekomm ich einen Fehler ausgegeben? geht min nicht mit einem Date-Typ?

ach, und was bedeuten denn die zahlen bei order by? kenn da bis jetzt nur die attribute.

besten dank

Besten dank, ich hab das Problem selbst gelöst ^^

Schön wäre es, wenn du dein Wissen mit allen teilst, damit bei der nächsten derartigen Frage auch eine fertige Lösung hier im Forum zu finden ist.

Komisch, ich dachte, hier schon geantwortet zu haben.

hmm, aber wenn ich das absolute Datum gegen:

(SELECT min(to_date(ereignis, ‘dd.mm.YYYY’) FROM tabelle))

austausche, bekomm ich einen Fehler ausgegeben? geht min nicht mit einem Date-Typ?

Ist das nun eine Frage, ob da ein fehler kommt? Und warum probierst Du es nicht? Und ja, min() geht auch mit DATE.

ach, und was bedeuten denn die zahlen bei order by? kenn da bis jetzt nur die attribute.

besten dank

Das sind auch Attribute, quasi Attribute meiner Faulheit. Man kann auch die Nummer der Spalte anstatt deren Namen angeben.

Andreas

Hi,

mein problem war einfach, dass das Datum in der Datenbank nicht als Date abgespeichert wird (is nich von mir ^^). Deshalb musste ich es erst umwandeln.

MfG