SQL:获取聚合函数的第一个条目?

时间:2013-05-17 08:51:59

标签: firebird

我有一张简单的表格:

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的值设置为表中的第一个值?

3 个答案:

答案 0 :(得分:2)

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

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

应该有用。

答案 1 :(得分:0)

Firebird不包含first()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。当被问及过去的位置聚合时,回答是:

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

答案 2 :(得分:-1)

这就是我想要的:

SELECT jid, max(amount) as firstBalance
FROM table
GROUP BY jid