我有一张简单的表格:
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的值设置为表中的第一个值?
答案 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