Aide avec requête SQL - magie nécessaire
-
26-09-2019 - |
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!
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)