Question

J'ai besoin d'aide avec une requête - j'utilise Firebird 2.1

.

J'ai une table comme:

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

Je voudrais obtenir les Durées pour chaque ActivityID mais s'il y a plus d'une des entrées disponibles avec le même ActivityID, j'ai besoin obtenir celui avec la valeur la plus élevée BilledAt. (La plus récente entrée)

Si j'Execute:

SELECT ActivityID, Max(BilledAt) 
FROM BilledTime 
GROUP BY ActivityID;

Je vais obtenir ce que je veux sans que les valeurs de durée. Si j'inclure la colonne Durée dans la clause GROUP BY, puis plusieurs ActivityIDs sont sélectionnés.

Y at-il une solution élégante à ce sujet?

Merci!

Était-ce utile?

La solution

Vous n'êtes pas familier avec Firebird ainsi la syntaxe peut-être tort, mais cela devrait fonctionner:

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

Vous pouvez également utiliser une plus intuitive où existe pas sous-requête au lieu de LEFT JOIN, mais je crois que les objectifs ci-dessus en étant plus rapide.

Autres conseils

Je ferais comme ça

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top