【问题标题】:get a sum on each row that adds the sum from previous row在每一行上得到一个总和,将前一行的总和相加
【发布时间】:2014-12-05 05:50:15
【问题描述】:

我需要对每一行求一个总和,并将前一行的总数相加

这是样本数据

    Fax         Counts
    2063504752  1
    2080906666  1
    7180930966  2
    7182160901  1
    7182232046  1
    7182234134  1
    7182234166  0
    7182248132  2
    7182390090  1
    7182395285  0
    7185462234  0
    7185465013  1
    7185465281  1
    7185466029  0



here's the desired output

Fax         Counts  Totals
2063504752  1   1
2080906666  1   2
7180930966  2   4
7182160901  1   5
7182232046  1   6
7182234134  1   7
7182234166  0   7
7182248132  2   9
7182390090  1   10
7182395285  0   10
7185462234  0   10
7185465013  1   11
7185465281  1   12
7185466029  0   12

所以我想取第一行,将结果记录在 Totals 列 (1)

转到第二行,将该行的计数 (1) 添加到上一行 (1) 的总计中,将结果记录在总计 (2) 中

转到第三行。将该行 (2) 的计数添加到上一行 (2) 的总计中,将结果记录在总计 (4) 中

转到第四行。将该行 (1) 中的计数添加到上一行 (4) 中的总计中,将结果记录在总计中 (5)

等等

我知道 LAG 函数会从前一行读取值,但我无法对前 2 行进行编码,这似乎是一个循环引用。

据我所知。它只是对最后 2 行求和,我不能将之前的值相加

WITH T AS
       (SELECT 2063504752 fax
           ,1 counts
          FROM DUAL
        UNION ALL
        SELECT 2080906666
           ,1
          FROM DUAL
        UNION ALL
        SELECT 7180930966
           ,2
          FROM DUAL
        UNION ALL
        SELECT 7182160901
           ,1
          FROM DUAL
        UNION ALL
        SELECT 7182232046
           ,1
          FROM DUAL
        UNION ALL
        SELECT 7182234134
           ,1
          FROM DUAL
        UNION ALL
        SELECT 7182234166
           ,0
          FROM DUAL
        UNION ALL
        SELECT 7182248132
           ,2
          FROM DUAL
        UNION ALL
        SELECT 7182390090
           ,2
          FROM DUAL
        UNION ALL
        SELECT 7182395285
           ,0
          FROM DUAL
        UNION ALL
        SELECT 7185462234
           ,0
          FROM DUAL
        UNION ALL
        SELECT 7185465013
           ,1
          FROM DUAL
        UNION ALL
        SELECT 7185465281
           ,1
          FROM DUAL
        UNION ALL
        SELECT 7185466029
           ,0
          FROM DUAL)
SELECT fax
      ,counts
      ,counts + LAG(counts, 1) OVER (ORDER BY fax) Counts1
  FROM T

【问题讨论】:

    标签: oracle oracle11g


    【解决方案1】:

    使用解析函数:

    select OtherID, Counts, sum(Counts) over(order by OtherID) Totals
    from your_table;
    

    sum(Counts) over(order by OtherID) 告诉 Oracle 将总和应用于从“开始”(根据 ORDER BY)到当前行的所有行。

    分析函数类似于聚合函数,但会为每一行生成结果。此外,您可以告诉 Oracle 必须使用哪些行(窗口)来计算每一行的结果。

    【讨论】:

    • 非常感谢!!!!我不能再接受 5 分钟的答案,我会尽快接受的
    猜你喜欢
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    • 1970-01-01
    • 2014-03-05
    • 2021-08-13
    • 1970-01-01
    相关资源
    最近更新 更多