Hilfe für SQL-Abfrage - einige Magie benötigt
-
26-09-2019 - |
Frage
Ich brauche Hilfe bei einer Abfrage - ich bin mit Firebird 2.1
.Ich habe eine Tabelle wie:
RowID (primary key) | ActivityID | Duration | BilledAt
1 | 1 | 50 | 06.08.2010, 14:05:00.598
2 | 1 | 70 | 06.08.2010, 14:05:00.608
3 | 2 | 30 | 06.08.2010, 14:05:00.598
4 | 3 | 40 | 06.08.2010, 14:05:00.598
5 | 3 | 50 | 06.08.2010, 14:05:00.608
Ich mag die Dauern erhalten für jeden ActivityID aber wenn es mehr als ein Eintrag zur Verfügung mit dem gleichen ActivityID, ich brauche den derjenige mit dem höchsten BilledAt Wert. (Der jüngste Eintrag)
Wenn ich ausführen:
SELECT ActivityID, Max(BilledAt)
FROM BilledTime
GROUP BY ActivityID;
Ich werde bekommen, was ich ohne die Dauer Werte wollen. Wenn ich die Dauer Spalte in der GROUP BY-Klausel enthalten, dann mehrere ActivityIDs ausgewählt werden.
Gibt es eine elegante Lösung für dieses?
Danke!
Lösung
Nicht mit Firebird vertraut, so dass die Syntax könnte falsch sein, aber dies sollte funktionieren:
SELECT a.ActivityID, a.Duration, a.BilledAt
FROM BilledTime a
LEFT JOIN BilledTime b on a.ActivityID = b.ActivityID AND b.BilledAt > a.BilledAt
WHERE b.ActivityID IS NULL
Alternativ können Sie intuitiver WHERE NOT EXISTS Unterabfrage statt der LEFT JOIN, aber ich glaube, die oben genannten Enden schneller zu sein.
Andere Tipps
Ich würde so tun
SELECT a.ActivityID, a.Duration, a.BilledAt
FROM BilledTime a
WHERE a.BilledAt = (select max(b.billedAt) from BilledTime b where b.ActivityId = a.ActivityID)