Anfängerproblem GROUP BY
thardy
- datenbank
0 Texter mit x0 thardy
0 Frank (no reg)0 thardy0 Texter mit x
Hallo,
ich bin ein totaler SQL-Neuling/Stumpfkopf und scheitere an einem sehr einfachen Problem, bitte nicht lachen.
Es geht um folgende Tabelle:
Tabelle obst:
name | preis | timestamp
Apfel | 45.00 | 1262731719
Birne | 94.96 | 1262731719
Orange | 19.95 | 1262731719
Kiwi | 15.50 | 1262731719
Kiwi | 14.50 | 1262732578
Birne | 94.98 | 1262733058
Kiwi | 15.50 | 1262767427
Kiwi | 14.50 | 1262768481
Ich möchte als Ergebnis zu jedem Obst den aktuellsten Preis haben, also die Zeile, mit der größten Timestamp.
Versucht habe ich ganz laienhaft einfach folgendes:
SELECT name, preis, MAX( ts )
FROM obst
GROUP BY name
Dann erhalte ich zwar die neuesten Timestamps, der Preis passt aber nicht dazu, die Kiwi dürfte mit dieser Timestamp ja nur 14,50 kosten:
Apfel | 45.00 | 1262731719
Birne | 94.96 | 1262733058
Kiwi | 15.50 | 1262768481
Orange | 19.95 | 1262731719
Wie macht man sowas?
Ich nutze übrigens MySQL 5, falls das von Bedeutung ist.
Danke fürs Lesen!
Gruß
Thomas
Dann erhalte ich zwar die neuesten Timestamps,
Was reiner Zufall ist.
der Preis passt aber nicht dazu,
Was reiner Zufall ist.
Wie macht man sowas?
Mit Sortierung, wie willst du sonst zum neusten timestamp kommen?
Dann erhalte ich zwar die neuesten Timestamps,
Was reiner Zufall ist.
Das glaub ich nicht, Tim.
Mit Sortierung, wie willst du sonst zum neusten timestamp kommen?
Mit MAX(ts)?
Dann erhalte ich zwar die neuesten Timestamps,
Was reiner Zufall ist.
Das glaub ich nicht, Tim.
Eine Datenbank ist kein Stapel karierter Hemden bei der man das oberste Hemd bekommen, wenn man zugreift. Ach ja, und ich hatte das MAX übersehen.
Hallo,
du benötigst MAX in einer korrelierenden Unterabfrage um dein Problem auf eine mögliche Weise zu lösen, GROUP BY Name, MAX(timestamp) und einen JOIN um es auf eine andere mögliche Weise zu lösen.
Gib mir Name, Preis und Timestamp wo Timestamp gleich dem maximalen Timestamp je Name ist ...
SELECT DISTINCT t1.*
FROM tabelle AS t1
WHERE timestamp = (SELECT MAX(t2.timestamp)
FROM tabelle AS t2
WHERE t2.Name = t1.Name)
Cheers, Frank
Das ist es, vielen Dank!
Gruß
Thomas
du benötigst MAX in einer korrelierenden Unterabfrage ...
Gib mir Name, Preis und Timestamp wo Timestamp gleich dem maximalen Timestamp je Name ist ...
SELECT DISTINCT t1.*
FROM tabelle AS t1
WHERE timestamp = (SELECT MAX(t2.timestamp)
FROM tabelle AS t2
WHERE t2.Name = t1.Name)
Danke für die Antwort auf die Frage eine ich hier mal gestellt habe aber auf die niemand geantwortet hat.
Wortstapel verbuchselt.
muss ich wohl damals übersehen haben ... und sonst antworten ja Ilja, dedlfix auch immer auf solche Fragen
btw: natürlich geht es auch mit SELECT TOP 1 ... ORDER BY ... in der korrellierenden Unterabfrage. Könnte ja nach Implementierung von Tabellen, Indizes und natürlich je nach Datenbanksystem Unterschiede hinsichtlich Performance machen.
Cheers, Frank