leider bin ich komplett neu bei postgresql, aber ich denke dass man mein Problem mit einem geschickten Skript lösen kann. Würde mich freuen wenn mir jemand einen Tipp gibt.
Also:
in meiner CSVdatei liegen die Werte wie folgt vor:
Dann die CSV Datei so wie sie ist in diese Zwischentabelle importieren (z.B. über COPY oder mit einem entsprechenden Tool).
Danach dann die Datensätze aus der Zwischentabelle in die “richtige” kopieren:
insert into zieltabelle (zeitpunkt, messpunkt, wert)
select zeitpunkt, 'A', wert_a
from stage_import
union all
select zeitpunkt, 'B', wert_b
from stage_import
union all
select zeitpunkt, 'C', wert_c
from stage_import;
Vielen Dank für den Hinweis, das hat so schon super funktioniert!
Allerdings habe ich noch ein weiteres Probleme…
Ich möchte zwecks Normalisierung gerne eine Tabelle in der nur die Messpunkte mit einer ID gelistet sind erstellen aus der ersten Zwischentabelle.
Also quasi nur die Namen der Spalten auflisten. Da die Tabelle sehr viele Spalten hat kann man sie nicht einfach per Hand übertragen. gibt es da eine Möglichkeit?
Naja, “Wert A”, “Wert B”, “Wert C” sind bei mir nicht drei Spalten, sondern ca. 50.000 und die möchte ich jetzt also in ein sql query bekommen ohne explizit ihre Namen hinschreiben zu müssen.
Ich habe mehrere CSV Dateien, die in ein Datenbankschema konvertiert werden sollen. Jede CSV Datei hat ca. 100 Spalten und 1 bis 10 Millionen Zeilen. Im Endeffekt müssen alle CSV Dateien in eine Tabelle. Also nicht 50.000 aber immernoch recht viel.
Btw. ist das importieren der CSV Dateien auch sehr anstrengend, weil der CREATE TABLE befehl für jede einzelne Spalte per Hand eingegeben werden muss.
Die Spaltennamen kannst Du aus information_schema.columns entnehmen. Aber da muß die Tabelle natürlich erst mal da sein. Nun weiß ich nicht, wie das da alles abläuft, vielleicht kannst das ja auch scripten. Wenn die CSV-Datien den Tabellen 1:1 entsprechen kannst die Spaltennamen ja auch weglassen.
ordinal_position. Mußt halt aus den Angaben Dir dynamisch Dein SQL basteln und via EXECUTE ausführen. Also mit einer pl/pgsql-Function arbeiten, SQL basteln, EXECUTE sql.
Sry Leute, aber ich bekomms nicht hin. Im Grunde möchte ich doch nur:
SELECT columns_name FROM information_schema.columns WHERE table_name = 'myTable'
LOOP columns_name
insert into zieltabelle (zeitpunkt, "columns_name", wert)
END LOOP
zumindest im Pseudocode, hat da noch jemand nen Tipp oder Hinweis?
würde mich sehr freuen.
Ich schrieb doch, du mußt Dir eine Funktion schreiben.
Innerhalb dieser dann sowas wie:
test=*# \d foo;
Table "public.foo"
Column | Type | Modifiers
--------+---------+-----------
c1 | integer |
c2 | integer |
c3 | integer |
test=*# select 'insert into zieltabelle (' || string_agg(column_name,',') || ')' from (select column_name from information_schema.columns where table_name = 'foo' and table_schema = 'public' order by ordinal_position)foo ;
?column?
------------------------------------
insert into zieltabelle (c1,c2,c3)
(1 row)
Also, das natürlich so nicht in der Funktion, ich wollt nur zeigen, wie Du die Column-Names für die Tabelle foo aus den Katalogen sammelst und daraus einen String frickelst.
insert into measurement (timestamp, sensor, value)
SELECT d."Timestamp",
( SELECT s.id FROM sensor s WHERE s.name = spalten.column_name),
( SELECT spalten.column_name from sensor_list where "Timestamp" = d."Timestamp")
FROM sensor_list d,
(select column_name from information_schema.columns where table_name = 'sensor_list' AND column_name <> 'Timestamp' order by ordinal_position) spalten
Als Fehlermeldung bekomme ich aber: “FEHLER: Spalte »value« hat Typ numeric, aber der Ausdruck hat Typ information_schema.sql_identifier”
Alles andere funktioniert. “spalten.column_name” funktioniert also nur im where-teil der zeile darüber und nicht nach dem select-befehl. Kann mir jemand sagen warum da ein Typ information_schema.sql_identifier rauskommt und ob man es irgendwie auf den numischen messwert casten kann?