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!

War es hilfreich?

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top