Group by oder Subselect?

p4ran0id

Benutzer
Beiträge
6
Hallo Leute ich hab eine Tabelle mit ID´s, Zählerständen(zv) und dem Datum(date).

Ich möchste für eine bestimmte ID den aktuellsten Zählerstand filtern, daher dachte ich an so etwas hier:

select zv from table
where id=123
and date=(select max(date) from table)

Leider kommt bei dieser Abfrage nichts heraus und ich weiß nicht wieso.
Meine andere alternative wäre mit einer Group By Klausel:

Select zv, max(date) as ablesezeit from table
where id=123
group by zvb
order by ablesezeit desc

Hier bekomme ich die ID mit dem aktuellsten Zälerstand, jedoch auch noch ältere Zählerstände. Später würde ich gerne von ca. 50 ID´s jeweil den aktuellsten Zählerstand ermitteln. Was müsste ich anders tun? Ich hoffe ich bin hier im richtigen Forenteil.
Danke schonmal.
 
Werbung:

ukulele

Datenbank-Guru
Beiträge
4.644
select zv from table
where id=123
and date=(select max(date) from table)

Leider kommt bei dieser Abfrage nichts heraus und ich weiß nicht wieso.
Meine andere alternative wäre mit einer Group By Klausel:
Vermutlich weil das maximale Datum nicht die id 123 hat sondern eine andere. Im Umkehrschluss gibt es keinen Datensatz mit der id 123 dessen Datum dem höchsten der gesammten Tabelle entspricht.
Select zv, max(date) as ablesezeit from table
where id=123
group by zvb
order by ablesezeit desc

Hier bekomme ich die ID mit dem aktuellsten Zälerstand, jedoch auch noch ältere Zählerstände. Später würde ich gerne von ca. 50 ID´s jeweil den aktuellsten Zählerstand ermitteln. Was müsste ich anders tun? Ich hoffe ich bin hier im richtigen Forenteil.
Danke schonmal.
Du gibts in GROUP BY zvb an, nicht zv. Wenn das kein Tippfehler ist wäre das der Grund und müsste zv heissen. Eventuell hast du aber auch noch mehr Spalten wie z.B.: Ablesezeit in deiner Ausgabe so das mehrere Zeilen pro zv ausgegeben werden.
 

akretschmer

Datenbank-Guru
Beiträge
9.523
Vermutlich weil das maximale Datum nicht die id 123 hat sondern eine andere. Im Umkehrschluss gibt es keinen Datensatz mit der id 123 dessen Datum dem höchsten der gesammten Tabelle entspricht.

Du gibts in GROUP BY zvb an, nicht zv. Wenn das kein Tippfehler ist wäre das der Grund und müsste zv heissen.

Ich würde von Oraggle erwarten, daß da ein Syntaxfehler kommt. Von daher stelle ich in Frage, daß Ora am Start ist ...
 

ukulele

Datenbank-Guru
Beiträge
4.644
Und
Select zv, max(date) as ablesezeit from table
where id=123
group by zv
order by ablesezeit desc
gibt tatsächlich mehrere identische zv Werte aus?
 

p4ran0id

Benutzer
Beiträge
6
ja das ergebnis sieht dann folgendermaßen aus (habe jetzt mal die ID 533 genommen und nochmal die ID in die Ausgabe gepackt, tut aber nichts zur Sache ).

An für sich ist das Ergebnis ja ok, aber ich will ja "nur" das aller letzte bzw. aktuellste Ergebnis haben. Und der Zählerstand ist immer mit einer ID verknüpft, deshalb verstehe ich nicht warum der Subselect nichts liefert.
 

Anhänge

  • group by.PNG
    group by.PNG
    15,6 KB · Aufrufe: 13

ukulele

Datenbank-Guru
Beiträge
4.644
Also GROUP BY funktioniert schon wie es soll, es gibt keine identischen zv Werte und zu jedem zv Wert wird das höchste datum ausgegeben. Wenn du jetzt nur das höchste Datum zur ID haben willst darf zv nicht unter den angezeigten Spalten sein oder muss aggregiert werden. Natürlich kann man zv auch anderweitig einbinden (das wurde in mehreren Threads die letzten Tage auch schon gemacht) aber dazu muss man natürlich entscheiden welchen zv Wert man haben will.
 

p4ran0id

Benutzer
Beiträge
6
Genau, an für sich funktioniert es wie es soll, jedoch möchte ich "nur" eine Zeile ausgeben, die mit dem höchsten Datumswert.

Da ich später mehrere ID´s suchen möchte, dachte ich an einen "IN Operator" womit ich dann bspw. ID533,123,4008 etc. in einer Liste habe mit dem aktuellsten Zählerstand. Jedoch stört mich halt bisher noch, dass alle Zählersände mit entsprechendem Datum ausgegeben werden.

Danke für die bisherigen Antworten Leute!
 

ukulele

Datenbank-Guru
Beiträge
4.644
Dann verstehe ich das Problem nicht. Such doch einfach nach:
Select id, max(date) as ablesezeit from table
where id IN ( 533,123,4008 )
group by id
order by ablesezeit desc
 

p4ran0id

Benutzer
Beiträge
6
Ja weil ich ja noch den zv brauche, und sobald ich diesen dazu packe, habe ich wieder von jeder ID alle Zählerstände. Ich will für die drei ID´s jeweils den aktuellsten Zählerstand. also müssten das drei datensätze sein, jedoch sind es nun 291....weil wieder für jede ID alle bekannten Zählerstände gekommen sind.verstehst du jetzt mein problem?
 

akretschmer

Datenbank-Guru
Beiträge
9.523
Ja weil ich ja noch den zv brauche, und sobald ich diesen dazu packe, habe ich wieder von jeder ID alle Zählerstände. Ich will für die drei ID´s jeweils den aktuellsten Zählerstand. also müssten das drei datensätze sein, jedoch sind es nun 291....weil wieder für jede ID alle bekannten Zählerstände gekommen sind.verstehst du jetzt mein problem?

Du ermittelst erst einmal (id, max(datum)) und suchst dann alles, was Du brauchst, mit where (id,datum) in (insert your first query here)

Also, select * from table where (select id, max(datum) from table group by id)

Unter PG könntest Du auch DISTINCT ON nehmen, wäre einfacher, ist aber kein SQL-Standard und wird wohl in Oraggle daher nicht gehen..

Anderer Weg wäre Einsatz von row_number(), was aber vermutlich langsamer wäre.


Viele Wege führen zum Ziel ...
 

ukulele

Datenbank-Guru
Beiträge
4.644
Dann nochmal meine Frage welchen zv du denn haben willst? Wenn es mehrere gibt muss die DB ja wissen welches der tollste ist und ich vermute mal du möchtest einen vz der das höchste datum hat und ich hoffe da gibt es immer nur einen :)
Code:
SELECT    t1.id,
        t2.vz,
        max(t1.date) AS ablesezeit
FROM    tabelle t1
LEFT JOIN tabelle t2
ON        t1.id = t2.id
AND        t1.date = t2.date
WHERE    t1.id IN ( 533,123,4008 )
GROUP BY t1.id
ORDER BY t1.ablesezeit DESC
 
Werbung:

p4ran0id

Benutzer
Beiträge
6
Wie ich schon sagte, den zv mit den aktuellsten Datum. In Access habe ich es hinbekommen, dort sind es dann genau drei Zeilen, mit ID,aktuellster Zählerstand und dem Datum der letzten Ablesung. Wenn ich mir jedoch den SQL Code ausgeben lasse dann wird dort mit "LAST" gearbeitet, wüsste aber nicht dass Oracle damit arbeiten kann, denke mal dass man das mit RowID umgehen kann. Danke für eure Bemühungen.
 
Oben