Denormalisierung einer Tabelle

Hallo,

ich habe eine Tabelle mit Wetterdaten. Diese Tabelle hat drei Spalten, die Messstelle, Zeit und Messwert. Zum CSV-Export möchte ich die Tabelle Denormalisieren, d.h. die Messtellen sollen jeweils als eigene Spalte erscheinen:

tb_messdaten

messstelle | zeit      |  wert
--------------------------------------
temp1      | 03:00:00  |  23.0
temp2      | 03:00:00  |  21.1
wind1      | 03:00:00  |  10.0
temp2      | 03:05:00  |  21.2
wind2      | 03:05:00  |  14.8
wind1      | 03:10:00  |  11.5
temp2      | 03:10:00  |  21.0
temp1      | 03:10:00  |  22.8
wind2      | 03:10:00  |  14.5
...

tb_messdaten_csv

zeit     | temp1  | temp2  | wind1  | wind2         
---------------------------------------------
03:00:00 |  23.0  |  21.1  |  10.0  |
03:05:00 |        |  21.2  |        |  11.8
03:10:00 |  22.8  |  21.0  |  11.5  |  14.5
...

Kann mir jemand zeigen, wie so etwas gemacht wird?

Am einfachsten geht das über eine ge-filterte Aggregation:

select zeit,
       max(wert) filter (where messstelle = 'temp1') as temp1,
       max(wert) filter (where messstelle = 'temp2') as temp2,
       max(wert) filter (where messstelle = 'wind1') as wind1,
       max(wert) filter (where messstelle = 'wind2') as wind2
from tb_messdaten
group by zeit
order by zeit;

Hallo castorp,

besten Dank für Deine schnelle Hilfe und Deine Lösung. Die “filter”-Funktion war mir nicht bekannt. Ich hatte es mit “case-when” versucht und gehofft, dass man kann es eleganter mit einem “join” lösen könnte.

Für viele Messstellen, möglicherweise auch wechselnd, scheint mir zusätzlich eine rekursive Lösung interessant. ich werde dieses Problem am nächsten Wochenende angehen.

Viele Grüße und einen schönen Sonntag

Rekursion ist evtl. algorithmisch “geil”, also interessant. Aber in der Mengenleere (RDBMS, SQL) eher nicht so interessant.
Oder was meinst Du genau?

Neben der Lösung von castorp wäre vermutlich auch eine “crosstab” Lösung hilfreich. Alle diese Lösung “kranken” leider an der Starrheit in der Tabellenstruktur / Select Clause. “Wechselnd” ist da nichts, außer man generiert das SQL Statement.

Das führt einen u.U. zu der Überlegung, wofür man die Transformation eigentlich braucht oder genauer, an welcher Stelle.
Idee: Nimmt man die Rohdaten ohne weitere Verarbeitung z.B. ein Spreadsheet Programm der Wahl, ist eine Kreuztabelle ruckzuck erstellt. (Selbst automatisiert)
Ähnlich gilt das wahrscheinlich für diverse Report Generatoren.

Wäre das ein Ansatz?

P.S.: Das “Wechselnde” in der Ergebnisstruktur einer Transformation ist ja nicht nur eine “Hürde” bei der Erstellung per SQL. Die wechselnde Struktur der Ergebnisse ist auch eine “Hürde” in einer dynamischen Weiterverarbeitung in SQL.

Das ändert aber nichts an dem grundlegenden Problem, dass die Anzahl der Spalten (sowie deren Datentyp und Namen) vor dem Starten einer Abfrage bekannt sein müssen.

Typischerweise ist es viel einfacher die Rohdaten zu exportieren und dann so eine Kreuztabelle mittels eine Tabellenkalkulation (LibreOffice, Excel, …) zu erzeugen.