SQL-Abfrage

Ich habe ein Problem mit einer SQL-Abfrage.

Ich habe folgende Tabelle:

id(int)|act_house(int)|time(int)|value(int)

Von dieser Tabelle will ich alle Felder abfragen und act_house gruppiert.
Es soll für jedes Haus nur der letzte Eintrag genommen werden. Also wo die Zeit maximal ist.
Derzeit hab ich das so probiert:

Code:
SELECT * FROM wmztable WHERE time=(SELECT max(time) FROM wmztable) group by act_house

Das Problem ist dass nur die zeilen genommen werden die insgesamt die höchste zeit haben. Ich will das aber für jedes Haus gruppieren.
 
Wie wär's denn damit:

Code:
SELECT *
FROM wmztable
WHERE time IN (
    SELECT max(time)
    FROM wmztable
    GROUP BY act_house
)

Möglicherweise geht das sogar ohne Subquery, aber im Moment fällt mir da kein Weg ein.
 
versuchs mal so: (edit: oder doch nicht, siehe nächster post von LX)
Code:
SELECT id, act_house, MAX(time) AS lasttime, value FROM wmztable GROUP BY act_house
@LX
ich glaube deine lösung ist nicht ganz korrekt. ein MAX(time) eines act_house könnte der gleiche time wert eines NICHT-Maximums eines anderen act_house sein und dann wären auch zeilen im ergebnis die NICHT das maximum eines act_house darstellen.
 
In dem Fall kann man sich auf die Werte in id und value aber nicht verlassen. GROUP BY fasst nur zusammen und max() bestimmt einen Maximalwert in den Gruppen... das heißt aber nicht, dass die Rückgabe dem Datensatz entspricht, in dem der Maximalwert vorkommt.

[EDIT]
Und in der Tat, das habe ich nicht bedacht, dass es ja Dopplungen bei time geben kann... das verkompliziert die Sache auch nochmal :)
 
Nur wenn time tatsächlich eindeutig ist... pass da lieber auf (siehe ivegotmails Kommentar dazu).
 
Naja wenn man es genau nimmt funktioniert es noch nicht ganz.

wenn ein act_house mit time doppelt vorkommt würde es mir noch nicht passen. weil ich von jeder zeit von jedem haus nur einen eintrag will.
Jetzt hab ich der ganzen abfrage noch ein group by act_house hinzugefügt.
Streng genommen würde das Ergebnis jetzt nicht mehr passen. Da aber ohne hin nur maximal jede minute geloggt wird und eine Abfrage über das Internet auch deutlich länger als eine Sekunde dauert ist das egal.

Das ganze dient nämlich einem Überwachungsprogramm für eine Solaranlage. Für Zeitkritische Dinge wäre es ohnehin zu ungenau.
 
eine weitere Möglichkeit wäre noch
Code:
SELECT *
FROM   wmztable w1
WHERE  time=(SELECT MAX(w2.time)
              FROM wmztable w2
              WHERE w1.act_house = w2.act_house) group by w1.act_house;

Keine Ahnung was jetzt besser ist. Schneller ist glaube ich das jetzt.
 
Zurück
Oben