(Dies ist eine Follow-up-Frage zu Merge table results into columns (pivot/crosstab?))Merge Tabelle führt in Spalt
Ich habe ~ 30 Tabellen, die „gestreamt“ Daten von einem externen System bekommt. Ich versuche herauszufinden, wie die gesammelten Daten zu einem einzigen Abfrageergebnis kombiniert werden können.
Lassen Sie uns das Tabellenlayout beschreiben:
CREATE TABLE IF NOT EXISTS table1 (
id1 INT NOT NULL,
id2 TEXT NOT NULL,
update_time TIMESTAMP(6) NOT NULL,
val NUMERIC NULL,
PRIMARY KEY (id1, id2, update_time)
);
CREATE TABLE IF NOT EXISTS table2 (
id1 INT NOT NULL,
id2 TEXT NOT NULL,
update_time TIMESTAMP(6) NOT NULL,
val INT NULL,
PRIMARY KEY (id1, id2, update_time)
);
--...tableN(
INSERT INTO table1(id1, id2, update_time, val) VALUES (1, 'ident 1', '2004-10-19 09:00:00', 1.23);
INSERT INTO table1(id1, id2, update_time, val) VALUES (1, 'ident 1', '2004-10-19 10:05:00', 1.25);
INSERT INTO table2(id1, id2, update_time, val) VALUES (1, 'ident 1', '2004-10-19 10:03:00', 23);
INSERT INTO table2(id1, id2, update_time, val) VALUES (1, 'ident 1', '2004-10-19 10:03:30', null);
INSERT INTO table2(id1, id2, update_time, val) VALUES (1, 'ident 1', '2004-10-19 10:05:00', 42);
Ist es möglich, alle „zu einem bestimmten Zeitpunkt bekannten Daten“ zu kombinieren aus allen Tabellen in einer einzigen Abfrage? Etwas wie:
time t1_val t2_val
'2004-10-19 09:00:00' 1.23 null
'2004-10-19 10:03:00' 1.23 23
'2004-10-19 10:03:30' 1.23 null
'2004-10-19 10:05:00' 1.25 42
Eine kleine Erklärung:
Am 09.00.00 wir wussten, dass tabelle1 hatte einen Wert von 1,23
SELECT update_time, t1_val, t2_val
FROM combined_output
WHERE start_time = '2004-10-19 08:00:00'
AND end_time = '2004-10-19 12:00:00'
die das Ergebnis geben würde. In Tabelle 2 war kein Wert vorhanden, daher sollte der Wert null sein.
Um 10:03:00 Tabelle2 wurde 23 hinzugefügt. Der Wert 1.23 in table1 ist immer noch der letzte bekannte Wert aus table1, der in der Ausgabe noch vorhanden sein sollte.
10:03:30 wie oben.
10:05:00 Sowohl table1 als auch table2 haben neue Werte, aber die Abfrage gibt nur eine einzige Zeile in der Ausgabe zurück, die beide neuen Werte in t1_val und t2_val enthält.
Es ist eigentlich nicht kritisch, mögliche Werte vor dem angeforderten Zeitbereich wegzufiltern. Wenn table2 einen Wert von 08:59:00 hätte, wäre es kein Nachteil, wenn dieser Wert in t2_val in der ersten Zeile des Beispiels angezeigt wird, auch wenn er nicht optimal ist.
(Beachten Sie, dass ich ~ 30 Tabellen kombinierten Daten aus, so dass für eine Lösung, die zu vielen Tabellen erweitert werden kann. Ändern das Tabellenlayout ist nicht möglich. Hohe Leistung nicht erforderlich ist.)
Sie können 'verwenden voll join' aber die Abfrage würde mit so vielen Tabellen umständlich aussehen. –