【问题标题】:sql function to add each row valuessql函数添加每行值
【发布时间】:2018-06-30 07:34:49
【问题描述】:

表一个

id
1
2
3
4

我希望输出是这样的:

id id_new
1   1
2   3 
3   6
4   10

基本上我们在每一行中添加一列的行值 即 2=1+2 ,3=1+2+3 依此类推 你可以使用任何游标、函数或查询

【问题讨论】:

  • sum(id)over(order by id)

标签: sql oracle cursor procedure func


【解决方案1】:

你似乎想要一个累积的总和。 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

【讨论】:

    【解决方案2】:

    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 接口也可能不支持分析功能。

    【讨论】:

    • 哈哈 +1 解码我的名字 ;)
    • @Pரதீப் 我知道是你,因为以前你的名字不是泰米尔语(我知道一些泰米尔语,因为我的大多数同事都是泰米尔人 :-))。
    【解决方案3】:

    小菜一碟。

    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>
    

    【讨论】:

    • 使它成为一个通用查询,对于 1,2,3...n
    • 给你,@sheetal
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 2020-04-16
    • 1970-01-01
    • 2017-04-08
    相关资源
    最近更新 更多