Auch leere Stunden ausgeben ...

Hi,

ich wollte mir mal ein sql-statement basteln, dass mir anzeigt, wieviele Ereignisse zu jeder Stunde an einem Tag passiert sind. Dabei passiert es auch einmal, dass wärend einer Stunde überhaupt nix passiert ist. Diese zeigt er mir leider nicht an bzw. diese Zeile existiert einfach nicht. Ich glaube, mein Ansatz ist zwar richtig, aber er gibt mir noch nicht das richtige aus. Kann mir da jemand behilflich sein?

Besten Dank.

SELECT 
    COUNT (Ereignis) AS anzahl,
    stunde::int
FROM
    (SELECT
        extract(hour from q) AS stunde
    FROM
        (SELECT
            s * '1 hour'::interval AS q 
        FROM
            generate_series(0, 23)
        s)
    eins)
zwei left join alle_ereignisse on (stunde) = (extract('hour' from zeitpunkt))

AND    to_char(zeitpunkt, 'DD') LIKE '%12%'
GROUP BY stunde
ORDER BY stunde;

du vergewaltigst einfach eine “series” als “quelle” fuer die stunden die ein tag nun mal hat … in etwa so:

SELECT
stunde.stunde,
COUNT(e.ereignis) as Anzahl
FROM generate_series(1, 24) as stunde
LEFT JOIN ereignisse … usw.
GROUP BY …

Besten Dank. Jetzt sieht der Befehl doch gleich noch etwas leichter aus ^^. Aber leider ist das ergebnis noch gleich. ich schätze mal, es liegt an der Zeile, oder?

left join ereignisse on (stunde) = (extract('hour' from zeitpunkt))

aber soviel kann man da doch gar net verkehrt machen, oder? ^^

MfG Mokelet

jenachdem WO die series steht musst du den join ansetzen

steht die series (wie in meinem fagment) direkt nach FROM so musst du LEFT JOIN anwenden, dann kriegst fuer jede stunde auch eine zeile

hmm, leider nicht. Aber kann das auch daran liegen, das ich noch n paar where-bedingungen drin hab? das die leeren zeilen wieder rausgekickt werden?

ja … du solltest die bedingungen, die sich auf deine subquery - bzw. die ereignis-tabelle beziehen mit AND an die join-bedingung haengen …

also … ON series.stunde <-> ereignisse AND ereignisse.xxxx AND usw …

statt
WHERE ereignisse.xxxx AND usw …

denn das WHERE schraenkt die gesamte ergebnismenge ein … NACH dem JOIN … das ON nur die gejointe menge … LEFT bleibt dabei erhalten

bei INNER-Joins ist das ergebnis das gleiche, weil das die natur von inner joins ist - hier haben wir aber ein LEFT … und wir wollen ja alle stunden sehen



test=*# select * from event;
 id |          time          | event
----+------------------------+-------
  1 | 2008-09-09 01:30:00+02 | bla
  2 | 2008-09-09 01:35:00+02 | bla2
  3 | 2008-09-09 02:35:00+02 | bla3
  4 | 2008-09-09 07:35:00+02 | bla4
(4 Zeilen)

Zeit: 0,230 ms
test=*# select s.s as hour, count(e.event) as count from generate_series(0,23) as s left join event e on (s.s=extract(hour from e.time)) group by 1 order by 1;
 hour | count
------+-------
    0 |     0
    1 |     2
    2 |     1
    3 |     0
    4 |     0
    5 |     0
    6 |     0
    7 |     1
    8 |     0
    9 |     0
   10 |     0
   11 |     0
   12 |     0
   13 |     0
   14 |     0
   15 |     0
   16 |     0
   17 |     0
   18 |     0
   19 |     0
   20 |     0
   21 |     0
   22 |     0
   23 |     0
(24 Zeilen)

Zeit: 0,657 ms
test=*#

gute Nacht, Andreas

Besten Dank. Hat prima geklappt ^^