1

我在查询方面需要一些帮助 - 我使用的是 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;

如果没有 Duration 值,我会得到我想要的。如果我在 GROUP BY 子句中包含 Duration 列,则会选择多个 ActivityID。

有一个优雅的解决方案吗?

谢谢!

4

2 回答 2

3

不熟悉 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

或者,您可以使用更直观的 WHERE NOT EXISTS 子查询而不是 LEFT JOIN,但我相信上述结果会更快。

于 2010-08-06T13:40:55.123 回答
1

我会这样做

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)
于 2010-08-06T13:47:52.613 回答