• DB2——sum over partition by 的用法


    参考的博文出处:http://www.cnblogs.com/luhe/p/4155612.html,对博文进行了修改新增,修改了错误的地方

    之前用过row_number(),rank()等排序与over( partition by ... ORDER BY ...),这两个比较好理解: 先分组,然后在组内排名。

    今天突然碰到sum(...) over( partition by ... ORDER BY ... ),居然搞不清除怎么执行的,所以查了些资料,做了下实操。

    1. 从最简单的开始

      sum(...) over( ),对所有行求和

      sum(...) over( order by ... ),和 =  第一行 到 与当前行同序号行的最后一行的所有值求和,文字不太好理解,请看下图的算法解析。

    复制代码
    with aa as
    ( 
    SELECT 1 a,1 b, 3 c FROM dual union
    SELECT 2 a,2 b, 3 c FROM dual union
    SELECT 3 a,3 b, 3 c FROM dual union
    SELECT 4 a,4 b, 3 c FROM dual union
    SELECT 5 a,5 b, 3 c FROM dual union
    SELECT 6 a,5 b, 3 c FROM dual union
    SELECT 7 a,2 b, 3 c FROM dual union
    SELECT 8 a,2 b, 8 c FROM dual union
    SELECT 9 a,3 b, 3 c FROM dual
    )
    SELECT a,b,c,
    sum(c) over(order by b) sum1,--有排序,求和当前行所在顺序号的C列所有值
    sum(c) over() sum2--无排序,求和 C列所有值
    from aa
    复制代码

     

    补充 by 松门一枝花:

     

    1. WITH aa AS
    2. ( SELECT 1 a,1 b, 3 c FROM dual
    3. UNION
    4. SELECT 2 a,2 b, 3 c FROM dual
    5. UNION
    6. SELECT 3 a,3 b, 3 c FROM dual
    7. UNION
    8. SELECT 4 a,4 b, 3 c FROM dual
    9. UNION
    10. SELECT 5 a,5 b, 3 c FROM dual
    11. UNION
    12. SELECT 6 a,5 b, 3 c FROM dual
    13. UNION
    14. SELECT 7 a,2 b, 3 c FROM dual
    15. UNION
    16. SELECT 8 a,2 b, 8 c FROM dual
    17. UNION
    18. SELECT 9 a,3 b, 3 c FROM dual
    19. )
    20. SELECT a,
    21. b,
    22. c,
    23. SUM(c) over(order by a) sum1,--有排序,求和当前行所在顺序号的C列所有值--【博主新增的】
    24. SUM(c) over(order by b) sum2,--有排序,求和当前行所在顺序号的C列所有值
    25. SUM(c) over() sum3 FROM aa order by a; --无排序,求和 C列所有值
    26.  


     

    2. 与 partition by 结合

      sum(...) over( partition by... ),同组内所行求和

      sum(...) over( partition by... order by ... ),同第1点中的排序求和原理,只是范围限制在组内

    复制代码
    with aa as
    ( 
    SELECT 1 a,1 b, 3 c FROM dual union
    SELECT 2 a,2 b, 3 c FROM dual union
    SELECT 3 a,3 b, 3 c FROM dual union
    SELECT 4 a,4 b, 3 c FROM dual union
    SELECT 5 a,5 b, 3 c FROM dual union
    SELECT 6 a,5 b, 3 c FROM dual union
    SELECT 7 a,2 b, 3 c FROM dual union
    SELECT 7 a,2 b, 8 c FROM dual union
    SELECT 9 a,3 b, 3 c FROM dual
    )
    SELECT a,b,c,sum(c) over( partition by b ) partition_sum,
    sum(c) over( partition by b order by a desc) partition_order_sum
      FROM aa;
    复制代码

      


  • 相关阅读:
    LaTeX 表格指定宽度并居中
    ubuntu 14.04服务器上使用nginx搭建wordpress博客详解
    17款可视化工具,让你的数据更酷炫
    创建oracle数据库图示(一步一步教你安装oracle)
    创建oracle数据库图示(一步一步教你安装oracle)
    oracle 内连接 外连接 查询 笔记
    oracle 内连接 外连接 查询 笔记
    Telnet用不了怎么办
    Telnet用不了怎么办
    File 类 操作实例
  • 原文地址:https://www.cnblogs.com/wy20110919/p/9551245.html
Copyright © 2020-2023  润新知