sql函数添加每个行的值

时间:2018-01-21 15:44:40

标签: sql oracle cursor procedure func

表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,依此类推 你可以使用任何光标,功能或查询

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>