SQLクエリとヘルプ - 必要に応じていくつかの魔法
-
26-09-2019 - |
質問
私は、クエリといくつかの助けが必要 - 。私はFirebirdの2.1を使用しています。
私のようなテーブルを持っています
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
私は、それぞれのActivityIDのために期間を取得したいのですが、同じのActivityIDで利用可能な複数のエントリがある場合、私は最高のBilledAt値のいずれかを取得する必要があります。 (最新のエントリ)
私は実行する場合:
SELECT ActivityID, Max(BilledAt)
FROM BilledTime
GROUP BY ActivityID;
私は、デュレーション値なしで私が欲しいものを得るでしょう。私は、GROUP BY句のDuration列が含まれている場合、複数のActivityIDsが選択されています。
エレガントな解決策はこれにありますか?
ありがとうございます。
解決
Firebirdのに慣れていない構文が間違っているかもしれませんが、これは動作するはずですのでます:
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
また、あなたではない代わりにLEFT JOINをのサブクエリをEXISTS WHEREより直感的に使用することができますが、私はより高速であることまで上記の両端を信じています。
他のヒント
私はこのように行うだろう。
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)
所属していません StackOverflow