0

我有一个简单的表:

ID - JID - AMOUNT 
1  -   1 - 100
2  -   2 - 50
3  -   2 - -25
4  -   3 - 100
5  -   3 - -50

我想结束:

JID - FIRSTBALANCE
1   - 100
2   - 50
3   - 100

因为 Firebird 在聚合方面非常困难,所以这是行不通的:

SELECT jid, amount as firstBalance
FROM table
GROUP BY jid

如何获取它以便按 JID 分组,并自动将 firstbalance 的值设置为表中的第一个值?

4

3 回答 3

2

取决于“自动将 firstbalance 的值设置为表中的第一个值”是什么意思。从您给出的期望结果的示例中,我认为您ID将给定组的最低值的行JID视为“第一”,所以

SELECT DISTINCT JID, 
   (SELECT amount FROM table s WHERE s.JID = o.JID ORDER BY s.ID ROWS 1)
FROM table o

应该管用。

于 2013-05-17T09:30:17.700 回答
0

Firebird 不包含 afirst()last()聚合函数。由于将选择哪个项目,团队已请求并拒绝了这一点。您需要为order by聚合的项目指定一个子句。

你选择的答案让你max(amount)不是first(amount)。这不是您要求的(尽管可能是您想要的)。

对于未来的 Google 员工/Bingers,这是您获得第一个项目的方式。这不是一个很好的解决方案,而且可能很慢。

select distinct a.jid,
      (select first 1 b.amount
       from table b
       where b.jid = a.jid
       order by b.id) as amount
from table a
order by a.jid

它将检索三个 JID 字段和由 ID 顺序确定的第一个找到的金额。

不要屏住呼吸,让它内置到 Firebird 中。当被问及过去的位置聚合时,回答是:

我对这个概念有很多麻烦,因为位置不是一个关系概念,并且位置运算符的引入将极大地抑制通过并行执行操作来提高性能的努力。

于 2015-05-27T14:05:52.833 回答
-2

这就是我一直在寻找的:

SELECT jid, max(amount) as firstBalance
FROM table
GROUP BY jid
于 2013-05-17T09:44:50.567 回答