SQL Abfrage

GekoCH

Grünschnabel
Hallo zusammen

Ich denke meine frage ist eine bekannte aber konnte keine Hilfe dazu fidnen....

ich habe folgende Datenbank
HTML:
time                      kanal  wert
"2010-07-14 16:51:51"      24      896
"2010-07-14 16:51:52"      24      930
"2010-07-14 16:51:52"      5        30.3103
"2010-07-14 16:51:53"      24      980
"2010-07-14 16:51:54"      24      1042
"2010-07-14 16:51:55"      24      1102
"2010-07-14 16:51:55"      5        30.1832
"2010-07-14 16:51:56"      24      1161
"2010-07-14 16:51:57"      24      1218
"2010-07-14 16:51:58"      24      1271
"2010-07-14 16:51:58"      5        30.0702


nun möchte ich eine Abfrage generieren damit nachher folgendes rauskommt:
time                      data1  data2
"2010-07-14 16:51:51"      896
"2010-07-14 16:51:52"      930     30.3103
"2010-07-14 16:51:53"      980
"2010-07-14 16:51:54"      1042
"2010-07-14 16:51:55"      1102   30.1832
geht das irgendwie?

Gruss
Andi
 
data1 und data2 können leer sein was immer mit einem Sekundenintervall grösser wird is time. Ob daten vorliegen doer nicht ist "random"
 
Zuerst mit IF() den Wert in die richtige Spalte bringen Die Andere Spalte mit einem Leerstring abfüllen. Dann die Zeilen noch Gruppieren und den höheren Wert auslesen.

SQL:
SELECT
	time,
	MAX(IF(kanal = 5, wert, '')) 	AS	data5,
	MAX(IF(kanal = 24, wert,''))	AS 	data24
FROM
	myTable
WHERE
	kanal IN (5,24)
GROUP BY
	time
 
Zuletzt bearbeitet von einem Moderator:
Zuerst mit IF() den Wert in die richtige Spalte bringen Die Andere Spalte mit einem Leerstring abfüllen. Dann die Zeilen noch Gruppieren und den höheren Wert auslesen.

SQL:
SELECT
	time,
	MAX(IF(kanal = 5, wert, '')) 	AS	data5,
	MAX(IF(kanal = 24, wert,''))	AS 	data24
FROM
	myTable
WHERE
	kanal IN (5,24)
GROUP BY
	time


hmm oops ich habe folgendes problem:
function if(boolean, double precision, "unknown") does not exist

es ist eben keine MYSQL sonder postgres...
 
Zuletzt bearbeitet von einem Moderator:
Tia, ev. Kennt postgrees Pivot oder Crasstable-Queries.
Ansonsten mal schauen ob das Ding CASE WHEN kennt.
 
So ich habe in bisschen gewurstelt und dabei habe ich folgendes:
Code:
SELECT time,
    CASE WHEN channel = 5  THEN to_char(value, '999D9999') else '' end as data1,
    CASE WHEN channel = 24 THEN to_char(value, '999999') else '' end as data2    
FROM
    database
WHERE
    channel IN (5,24)
GROUP BY
    TIME,channel,value
ORDER BY
    TIME


tabelle1.png

Das ist fast perfekt aber ich möchte noch gerne dass die Daten die das gleiche Datum haben auch auf der gleiche zeile bleiben und somit das Datum nur einmal vorkommt.

Gruss
Andi
 
Zuletzt bearbeitet:
In meinem Beispiel ist da noch ein MAX()

geht mit deiner DBMS das folgende?

SQL:
MAX(CASE WHEN channel = 5  THEN to_char(value, '999D9999') else '' end) as data1,
 
Zuletzt bearbeitet von einem Moderator:
Wohoooo cool danke das habe ich völlig übersehen******

Code:
SELECT time,
    MAX(CASE WHEN channel = 5  THEN to_char(value, '999D9999') else '' end) as data1,
    MAX(CASE WHEN channel = 24 THEN to_char(value, '999999') else '' end) as data2    
FROM
    database
WHERE
    channel IN (5,24)
GROUP BY
    TIME
ORDER BY
    TIME

ergibt nun
tabelle2.png



Super, danke vielmals für deine / eure Hilfe das hat super geklappt!
Danke danke danke!
 
Zur Erklärung

Mit dem Case schreibst du die Daten in die richtige Spalte.Anschliessend Gruppierst du sie über den Tiemstamp.
Wenn jetzt mehrere Zeilen denselben Timestamp haben, dann muss man etwas mit den Werten machen. In deinem Fall wird einfach der Höchste genommen.

Das wird so richtig funktionieren, solange der Fall nicht vorkommt, dass auf denselben Timestamp mehrmals der gleiche channel vorhanden ist. Sollte dies auf einmal zutreffen, dann wird der Grössere Wert genommen und der kleinere verschwindet.
 

Neue Beiträge

Zurück