Rolf b: mysql: Nach Datumswerten gruppieren

Beitrag lesen

Ich liefere mal nach, was für eine forenfreundliche Fragestellung nötig gewesen wäre. Da ich Gedanken nur deutlich lesen kann, wenn ich Dir direkt in die Augen schaue, bin ich auf die undeutlichen Emanationen zwischen deinen geschriebenen Zeilen angewiesen und könnte eventuell nicht ganz richtig liegen.

Du hast zwei Tabellen mit Timestamps und Werten. Die Timestamps bringst Du irgendwie auf Tage herunter und zählst, wieviele Werte es in den Tabellen pro Tag gibt. Bis dahin bist Du klar gekommen. Deshalb abstrahiere ich das Problem der Datumsgewinnung und nehme an, dass die Tabellen eine einfache und kompatible Datumsspalte hätten, so dass die Gruppierung pro Log-Tabelle so vereinfacht werden kann.

SELECT datum, COUNT(*) AS zeilen FROM logTab1 GROUP BY datum

Ich habe mir zwei Testtabellen logTab1 und logTab2 gemacht. Wenn ich den Select drüberlaufen lasse, liefern sie mir

datum   zeilen
   1       2
   2       3
   3       4
   4       2
   5       1 

datum   zeilen
   1       1
   2       2
   4       1

Wenn ich Dich richtig verstehe, willst Du eine Quote haben, wieviele "Langsame" Einträge (in logTab2) es im Vergleich zu allen Einträgen des Tages (in logTab1) gibt, d.h. Du erwartest etwas in dieser Art

datum    quote
   1     0,5
   2     0,67
   3       0
   4     0,5
   5       0

Lösung ist ein LEFT OUTER JOIN der beiden Gruppierergebnisse. Die FROM Klausel akzeptiert nämlich nicht nur Tabellennamen, sondern auch SELECT-Abfragen (weil die auch nur Tabellen liefern). Ein kleines Problem sind die Tage, wo Du keine langsamen Requests hattest, die fehlen in der logTab2-Auswertung und ein LEFT JOIN erzeugt dann NULL als Wert für diese Spalten. Dafür gibt's die Funktion COALESCE, der übergibst beliebig viele Parameter und zurück kommt der erste, der nicht NULL ist. Den CAST(... as float) habe ich hinzugefügt, weil sonst eine INTEGER-Division stattfindet und deren Ergebnis wäre in deinem Fall immer 0.

SELECT x.datum, x.zeilen, y.datum, y.zeilen, CAST(COALESCE(y.zeilen, 0) AS FLOAT)/ x.zeilen AS Quote
FROM (SELECT datum, COUNT(*) AS zeilen FROM logTab1 GROUP BY datum) x LEFT JOIN
     (SELECT datum, COUNT(*) AS zeilen FROM logTab2 GROUP BY datum) y ON x.datum = y.datum

Die Query ist etwas breiter als Du es brauchst, aber so siehst Du auch die Zwischenergebnisse. Das Ergebnis sieht so aus:

datum    zeilen    datum    zeilen    quote
   1        2         1        1        0,5
   2        3         2        2        0,67
   3        4       NULL     NULL       0
   4        2         4        1        0,5
   5        1       NULL     NULL       0

Die Anwendung dieses Vorschlages auf das Problem sei dem Leser als Übung überlassen ;-)

Rolf