表a
id
1
2
3
4
我希望输出如下:
id id_new
1 1
2 3
3 6
4 10
基本上我们在每行中添加一列的行值 i.E 2 = 1 + 2,3 = 1 + 2 + 3,依此类推 你可以使用任何光标,功能或查询
答案 0 :(得分:4)
您似乎想要累积总和。 ANSI标准函数是一个窗口函数,由Oracle支持:
select id, sum(id) over (order by id) as id_new
from t;
但是,使用名为id
的列执行此操作似乎很奇怪。通常,累积金额是计数或金额或可衡量的东西。
如果您需要实际更新数据,则可以使用相关子查询:
update t
set id_new = (select sum(id) from t t2 where t2.id <= t.id);
这适用于小桌子。对于任何更大的内容,请使用merge
。
答案 1 :(得分:4)
Pradeep的评论可能是继续甲骨文的方式。但是有一种替代方法,即使用相关子查询来计算滚动总和:
SELECT
id,
(SELECT SUM(t2.id) FROM yourTable t2 WHERE t2.id <= t1.id) id_new
FROM yourTable t1;
这个答案可能有一些优点,因为并非每个数据库都支持分析功能。即使我们在例如Java应用程序的上下文中使用Oracle,像JPA或Hibernate这样的ORM接口也可能不支持分析函数。
答案 2 :(得分:2)
一块蛋糕。
SQL> with test (id) as
2 (select 1 from dual union
3 select 2 from dual union
4 select 3 from dual union
5 select 4 from dual
6 )
7 select id, sum(id) over (order by id) id_new
8 from test
9 order by id;
ID ID_NEW
---------- ----------
1 1
2 3
3 6
4 10
SQL>
[编辑,广义选项]
SQL> select level id, sum(level) over (order by level) new_Id
2 from dual
3 connect by level <= &n;
Enter value for n: 5
old 3: connect by level <= &n
new 3: connect by level <= 5
ID NEW_ID
---------- ----------
1 1
2 3
3 6
4 10
5 15
SQL> /
Enter value for n: 3
old 3: connect by level <= &n
new 3: connect by level <= 3
ID NEW_ID
---------- ----------
1 1
2 3
3 6
SQL>