帮助SQL查询 - 需要一些魔力

时间:2010-08-06 13:33:15

标签: sql firebird firebird2.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;

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

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

谢谢!

2 个答案:

答案 0 :(得分: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,但我相信上述结果会更快。

答案 1 :(得分: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)