`
zengshaotao
  • 浏览: 810889 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

DB2之OLAP函数

    博客分类:
  • DB2
 
阅读更多

说起 DB2 在线分析处理,可以用很好很强大来形容。这项功能特别适用于各种统计查询,这些查询用通常的SQL很难实现,或者根本就无发实现。首先,我们从一个简单的例子开始,来一步一步揭开它神秘的面纱,请看下面的SQL

 

[c-sharp] view plaincopy
 
  1. SELECT  
  2.     ROW_NUMBER() OVER(ORDER BY SALARY) AS 序号,  
  3.     NAME AS 姓名,  
  4.     DEPT AS 部门,  
  5.     SALARY AS 工资  
  6. FROM  
  7. (  
  8.     --姓名    部门  工资  
  9.     VALUES  
  10.     ('张三','市场部',4000),  
  11.     ('赵红','技术部',2000),  
  12.     ('李四','市场部',5000),  
  13.     ('李白','技术部',5000),  
  14.     ('王五','市场部',NULL),  
  15.     ('王蓝','技术部',4000)  
  16. ) AS EMPLOY(NAME,DEPT,SALARY);  
  17.    
  18. 查询结果如下:  
  19.    
  20. 序号       姓名       部门       工资  
  21. 1     赵红       技术部    2000  
  22. 2     张三       市场部    4000  
  23. 3     王蓝       技术部    4000  
  24. 4     李四       市场部    5000  
  25. 5     李白       技术部    5000  
  26. 6     王五       市场部    (null)  

 

 

看到上面的ROW_NUMBER() OVER()了吗?很多人非常不理解,怎么两个函数能这么写呢?甚至有人怀疑上面的SQL语句是不是真的能执行。其实,ROW_NUMBER是个函数没错,它的作用从它的名字也可以看出来,就是给查询结果集编号。但是,OVER并不是一个函数,而是一个表达式,它的作用是定义一个作用域(或者可以说是结果集),OVER前面的函数只对OVER定义的结果集起作用。怎么样,不明白?没关系,我们后面还会详细介绍。

 

从上面的SQL我们可以看出,典型的 DB2 在线分析处理的格式包括两部分:函数部分OVER表达式部分。那么,函数部分可以有哪些函数呢?如下:

 

[c-sharp] view plaincopy
 
  1. ROW_NUMBER  
  2. RANK  
  3. DENSE_RANK  
  4. FIRST_VALUE  
  5. LAST_VALUE  
  6. LAG  
  7. LEAD  
  8. COUNT  
  9. MIN  
  10. MAX  
  11. AVG  
  12. SUM  

 

 

上面这些函数的作用,我会在后面逐步给大家介绍,大家可以根据函数名猜测一下函数的作用。

 

假设我想在不改变上面语句的查询结果的情况下,追加对部门员工的平均工资和全体员工的平均工资的查询,怎么办呢?用通常的SQL很难查询,但是用OLAP函数则非常简单,如下SQL所示:

 

[c-sharp] view plaincopy
 
  1. SELECT  
  2.     ROW_NUMBER() OVER() AS 序号,  
  3.     ROW_NUMBER() OVER(PARTITION BY DEPT ORDER BY SALARY) AS 部门序号,  
  4.     NAME AS 姓名,  
  5.     DEPT AS 部门,  
  6.     SALARY AS 工资,  
  7.     AVG(SALARY) OVER(PARTITION BY DEPT) AS 部门平均工资,  
  8.     AVG(SALARY) OVER() AS 全员平均工资  
  9. FROM  
  10. (  
  11.     --姓名    部门  工资  
  12.     VALUES  
  13.     ('张三','市场部',4000),  
  14.     ('赵红','技术部',2000),  
  15.     ('李四','市场部',5000),  
  16.     ('李白','技术部',5000),  
  17.     ('王五','市场部',NULL),  
  18.     ('王蓝','技术部',4000)  
  19. ) AS EMPLOY(NAME,DEPT,SALARY);  
  20.    
  21.    
  22. 查询结果如下:  
  23.    
  24. 序号       部门序号       姓名       部门       工资       部门平均工资       全员平均工资  
  25. 1            1          张三       市场部    4000       4500                     4000  
  26. 2            2          李四       市场部    5000       4500                     4000  
  27. 3            3          王五       市场部    (null)     4500                     4000  
  28. 4            1          赵红       技术部    2000       3666                     4000  
  29. 5            2          王蓝       技术部    4000       3666                     4000  
  30. 6            3          李白       技术部    5000       3666                     4000  

 

 

请注意序号和部门序号之间的区别,我们在查询部门序号的时候,在OVER表达式中多了两个子句,分别是PARTITION BY ORDER BY。它们有什么作用呢?在介绍它们的作用之前,我们先来回顾一下OVER的作用,还记得吗?

 

OVER是一个表达式,它的作用是定义一个作用域(或者可以说是结果集),OVER前面的函数只对OVER定义的结果集起作用。

 

ORDER BY的作用大家应该非常熟悉,用来对结果集排序。PARTITION BY的作用其实也很简单,和GROUP BY的作用相同,用来对结果集分组。

 

  到此为止,大家应该对OLAP函数的套路有一定的了解和体会了吧。大家看一下上面SQL的结果集,发现王五的工资是null,当我们按工资排序时,null被放到最后,我们想把null放在前边该怎么办呢?使用NULLS FIRST关键字即可,默认是NULLS LAST请看下面的SQL

 

[c-sharp] view plaincopy
 
  1. SELECT  
  2.     ROW_NUMBER() OVER(ORDER BY SALARY desc NULLS FIRST) AS RN,  
  3.     RANK() OVER(ORDER BY SALARY desc NULLS FIRST) AS RK,  
  4.     DENSE_RANK() OVER(ORDER BY SALARY desc NULLS FIRST) AS D_RK,  
  5.     NAME AS 姓名,  
  6.     DEPT AS 部门,  
  7.     SALARY AS 工资  
  8. FROM  
  9. (  
  10.     --姓名    部门  工资  
  11.     VALUES  
  12.     ('张三','市场部',4000),  
  13.     ('赵红','技术部',2000),  
  14.     ('李四','市场部',5000),  
  15.     ('李白','技术部',5000),  
  16.     ('王五','市场部',NULL),  
  17.     ('王蓝','技术部',4000)  
  18. ) AS EMPLOY(NAME,DEPT,SALARY);  
  19.    
  20. 查询结果如下:  
  21.    
  22. RN  RK   D_RK     姓名       部门       工资  
  23. 1     1     1     王五       市场部    (null)  
  24. 2     2     2     李四       市场部    5000  
  25. 3     2     2     李白       技术部    5000  
  26. 4     4     3     张三       市场部    4000  
  27. 5     4     3     王蓝       技术部    4000  
  28. 6     6     4     赵红       技术部    2000  

 

 

请注意ROW_NUMBERRANK之间的区别,RANK是等级,排名的意思,李四和李白的工资都是5000,他们并列排名第二。张三和王蓝的工资都是4000,怎么RANK函数的排名是第四,而DENSE_RANK的排名是第三呢?这正是这两个函数之间的区别。由于有两个第二名,所以RANK函数默认没有第三名。

 

  现在又有个新问题,假设让你查询一下每个员工的工资以及工资小于他的所有员工的平均工资,该怎么办呢?怎么?没听明白问题?不要紧,请看下面的SQL

 

[c-sharp] view plaincopy
 
  1. SELECT  
  2.     NAME AS 姓名,  
  3.     SALARY AS 工资,  
  4.     SUM(SALARY) OVER(ORDER BY SALARY NULLS FIRST ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS 小于本人工资的总额,  
  5.     SUM(SALARY) OVER(ORDER BY SALARY NULLS FIRST ROWS BETWEEN  CURRENT ROW AND UNBOUNDED FOLLOWING) AS 大于本人工资的总额,  
  6.     SUM(SALARY) OVER(ORDER BY SALARY NULLS FIRST ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS 工资总额1,  
  7.     SUM(SALARY) OVER() AS 工资总额2  
  8. FROM  
  9. (  
  10.     --姓名    部门  工资  
  11.     VALUES  
  12.     ('张三','市场部',4000),  
  13.     ('赵红','技术部',2000),  
  14.     ('李四','市场部',5000),  
  15.     ('李白','技术部',5000),  
  16.     ('王五','市场部',NULL),  
  17.     ('王蓝','技术部',4000)  
  18. ) AS EMPLOY(NAME,DEPT,SALARY);  
  19.    
  20. 查询结果如下:  
  21.    
  22. 姓名       工资       小于本人工资的总额    大于本人工资的总额    工资总额1     工资总额2  
  23. 王五       (null)     (null)             20000              20000            20000  
  24. 赵红       2000       2000               20000              20000            20000  
  25. 张三       4000       6000               18000              20000            20000  
  26. 王蓝       4000       10000              14000              20000            20000  
  27. 李四       5000       15000              10000              20000            20000  
  28. 李白       5000       20000              5000               20000            20000  

 

 

上面SQL 中的OVER部分出现了一个ROWS子句,我们先来看一下ROWS子句的结构:

 

[c-sharp] view plaincopy
 
  1. ROWS BETWEEN <上限条件> AND <下限条件>  
  2.    
  3. 其中“上限条件”可以是如下关键字:  
  4. UNBOUNDED PRECEDING  
  5. <number>  PRECEDING  
  6. CURRENT ROW  
  7.    
  8. “下线条件”可以是如下关键字:  
  9. CURRENT ROW  
  10. <number> FOLLOWING  
  11. UNBOUNDED FOLLOWING  

 

 

注意,以上关键字都是相对当前行的,UNBOUNDED PRECEDING表示当前行前面的所有行,也就是说没有上限;<number>  PRECEDING表示从当前行开始到它前面的<number>行为止,例如,number=2,表示的是当前行前面的2行;CURRENT ROW表示当前行。至于其它两个关键字,我想,不用我说,你也应该知道了吧。如果你还不明白,请仔细分析上面SQL的查询结果。

 

  OVER表达式还可以有个子句,那就是RANGE,它的使用方式和ROWS 十分相似,或者说一模一样,作用也差多不,不过有点区别,如下所示:

 

RANGE BETWEEN <上限条件> AND <下限条件>

 

其中的<上限条件> <下限条件>ROWS一模一样,如下的SQL演示它们之间的区别:

 

[c-sharp] view plaincopy
 
  1. SELECT  
  2.     NAME AS 姓名,  
  3.     DEPT AS 部门,  
  4.     SALARY AS 工资,  
  5.     FIRST_VALUE(SALARY, 'IGNORE NULLS') OVER(PARTITION BY DEPT) AS 部门最低工资,  
  6.     LAST_VALUE(SALARY, 'RESPECT NULLS') OVER(PARTITION BY DEPT) AS 部门最高工资,  
  7.     SUM(SALARY) OVER(ORDER BY SALARY ROWS BETWEEN 1 PRECEDING  AND 1 FOLLOWING) AS ROWS,  
  8.     SUM(SALARY) OVER(ORDER BY SALARY RANGE BETWEEN 500 PRECEDING AND 500 FOLLOWING) AS RANGE  
  9. FROM  
  10. (  
  11.     --姓名    部门  工资  
  12.     VALUES  
  13.     ('张三','市场部',2000),  
  14.     ('赵红','技术部',2400),  
  15.     ('李四','市场部',3000),  
  16.     ('李白','技术部',3200),  
  17.     ('王五','市场部',4000),  
  18.     ('王蓝','技术部',5000)  
  19. ) AS EMPLOY(NAME,DEPT,SALARY);  
  20.    
  21. 查询结果如下:  
  22.    
  23. 姓名       部门       工资       部门最低工资       部门最高工资       ROWS    RANGE  
  24. 张三       市场部    2000       2000              4000             4400       4400  
  25. 赵红       技术部    2400       2400              5000             7400       4400  
  26. 李四       市场部    3000       2000              4000             8600       6200  
  27. 李白       技术部    3200       2400              5000             10200     6200  
  28. 王五       市场部    4000       2000              4000             12200     4000  
  29. 王蓝       技术部    5000       2400              5000             9000       5000  

 

 

上面SQLRANGE 子句的作用是定义一个工资范围,这个范围的上限是当前行的工资-500,下限是当前行工资+500。例如:李四的工资是3000,所以上限是3000-500=2500,下限是3000+500=3500,那么有谁的工资在2500-3500这个范围呢?只有李四和李白,所以RANGE列的值就是3000(李四)+3200(李白)=6200。以上就是ROWSRANGE得区别。

 

  上面的SQL 还用到了FIRST_VALUELAST_VALUE两个函数,它们的作用也非常简单,用来求OVER 定义集合的最小值和最大值。值得注意的是这两个函数有个参数,'IGNORE NULLS' 或 'RESPECT NULLS',它们的作用正如它们的名字一样,用来忽略NULL值和考虑NULL值。

 

  还有两个函数我们没有介绍,LAGLEAD这两个函数的功能非常强大,请看下面SQL

 

[c-sharp] view plaincopy
 
  1. SELECT  
  2.     NAME AS 姓名,  
  3.     SALARY AS 工资,  
  4.     LAG(SALARY,0) OVER(ORDER BY SALARY) AS LAG0,  
  5.     LAG(SALARY) OVER(ORDER BY SALARY) AS LAG1,  
  6.     LAG(SALARY,2) OVER(ORDER BY SALARY) AS LAG2,  
  7.     LAG(SALARY,3,0,'IGNORE NULLS') OVER(ORDER BY SALARY) AS LAG3,  
  8.     LAG(SALARY,4,-1,'RESPECT NULLS') OVER(ORDER BY SALARY) AS LAG4,  
  9.     LEAD(SALARY) OVER(ORDER BY SALARY) AS LEAD  
  10. FROM  
  11. (  
  12.     --姓名    部门  工资  
  13.     VALUES  
  14.     ('张三','市场部',2000),  
  15.     ('赵红','技术部',2400),  
  16.     ('李四','市场部',3000),  
  17.     ('李白','技术部',3200),  
  18.     ('王五','市场部',4000),  
  19.     ('王蓝','技术部',5000)  
  20. ) AS EMPLOY(NAME,DEPT,SALARY);  
  21.    
  22. 查询结果如下:  
  23.    
  24. 姓名       工资       LAG0      LAG1      LAG2      LAG3      LAG4      LEAD  
  25. 张三       2000       2000      (null)   (null)       0       -1        2400  
  26. 赵红       2400       2400       2000    (null)       0       -1        3000  
  27. 李四       3000       3000       2400     2000       0        -1        3200  
  28. 李白       3200       3200       3000     2400       2000     -1        4000  
  29. 王五       4000       4000       3200     3000       2400     2000      5000  
  30. 王蓝       5000       5000       4000     3200       3000     2400      (null)  

 

 

  我们先来看一下LAG  LEAD 函数的声明,如下:

 

LAG(表达式或字段偏移量默认值, IGNORE NULLSRESPECT NULLS)

 

LAG是向下偏移,LEAD是想上偏移,大家看一下上面SQL的查询结果就一目了然了。

 

  到此为止,有关DB2 OLAP 函数的所有知识都介绍给大家了,下面我们再次回顾一下 DB2 在线分析处理 的组成部分,如下:

 

函数 OVER(PARTITION BY 子句 ORDER BY 子句 ROWSRANGE子句)

分享到:
评论

相关推荐

    DB2中OLAP函数

    DB2中OLAP函数。电子文档里面有详细介绍!对学习开窗函数有很好的帮助。联机分析处理OLAP是一种软件技术,它使分析人员能够迅速、一致、交互地从各个方面观察信息,以达到深入理解数据的目的。

    (开发人员应当读的文章)Bob Lyle 谈 DB2 中的 OLAP 函数

    ### DB2中的OLAP函数详解 #### 一、引言 在数据库管理领域,特别是针对IBM的DB2 Universal Database,OLAP(Online Analytical Processing,在线分析处理)函数的引入极大地提高了数据分析的能力和效率。本文将...

    DB2到GreenPlum/PostgreSQL的转换指南

    - SQL谓词、临时表、CASE表达式、列函数、OLAP函数、标量函数等SQL组件的差异。 - ORDER BY、GROUP BY、HAVING子句的使用方法。 - 动态游标、连接操作、子查询的处理方式。 - UNION和UNION ALL的用法。 - 动态SQL的...

    IBM OLAP redbook -- business intelligence

    混合分析是DB2 OLAP Server V8.1中的一个重要特性,它允许用户在一个查询中同时访问OLAP数据和关系型数据。这种混合访问的能力极大地提高了业务智能系统的灵活性和实用性。例如,在分析销售趋势时,除了可以从多维...

    DB2 SQL 精萃.pdf

    8. ROLLUP、CUBE、GROUPING SETS等OLAP函数的使用。 9. EXISTS与IN关键字的使用,以及SOME和ANY的使用区别。 10. EXCEPT、INTERSECT、UNION等集合操作的使用。 11. 使用MERGE语句进行数据操作。 12. 采集样本数据的...

    DB2 许可证文件

    1. **Column Store**:v9.7 引入了列式存储模式,这在数据分析和OLAP(在线分析处理)场景中显著提高了性能,因为它优化了大量数据的读取操作。 2. **PureScale**:这是一个高可用性、可扩展的集群解决方案,允许多...

    DB2 SQL 精粹

    3. 数据仓库和OLAP:在DB2中构建数据仓库,支持复杂的在线分析处理(OLAP)操作。 总之,《DB2 SQL精粹》这本书全面覆盖了DB2 SQL的各个方面,无论是初学者还是经验丰富的DBA,都能从中受益,提升自己的数据库管理...

    DB2 redbook(中文版)

    - 分析功能:介绍DB2的内置分析函数和OLAP(在线分析处理)支持,以及与IBM Cognos、SPSS等分析工具的集成。 - 数据安全:探讨DB2的数据加密、访问控制和审计功能,以确保数据的安全性。 5. **故障排查与恢复**:...

    db2结构基础电子书

    虽然DB2与其他关系型数据库系统在功能上有相似之处,但在很多方面存在根本性的差异。 - **术语差异性**:尽管DB2和其他数据库系统使用的术语可能听起来类似,但它们所指的概念可能完全不同。因此,在学习和使用DB2...

    DB2分区数据库简介-DPF

    - 当面临大量的数据存储需求时,尤其是在TB级别的数据量之上。 - 当系统的并发访问量非常大时,比如每天有数十万甚至数百万次的访问请求。 - 当现有数据库架构无法满足业务需求的增长速度时,比如查询响应时间变慢、...

    IBM DB2通用数据库SQL入门.rar

    1. DB2 SQL扩展:除了标准SQL,DB2还支持一系列扩展功能,如嵌套SQL、用户自定义函数(UDF)、存储过程等。 2. 分区:通过分区技术,大型表可以根据某个字段值进行分割,提高查询效率。 3. 视图:视图是虚拟表,基于...

    IBM DB2通用数据库商业智能教程

    1. **数据立方体(OLAP Cube)**:通过预计算和存储汇总数据,提供快速的多角度查询性能。 2. **星型和雪花模式**:常见的数据仓库架构,星型模式以事实表为中心,连接多个维度表;雪花模式是星型模式的优化,通过...

    DB2 SQL 消息

    当尝试调用一个存储过程或函数时,如果提供的参数类型与定义在该例程中的参数类型不匹配,就会触发此错误。这意味着DB2无法找到一个与所提供的参数类型相匹配的例程版本。 **原因分析:** 1. **参数类型不匹配:**...

    DB2 数据库分区的介绍

    - **哈希分布**:使用哈希函数将数据均匀分布到各个分区中,例如基于`customer`表中的`cust_id`字段作为哈希键。 - **分区位图**:通过位图记录每个分区的数据分布情况,便于管理和查询。 #### 六、数据库分区组 -...

    常用数据库对比.docx

    Oracle和DB2都支持这两种场景,但Oracle在OLAP上提供了更丰富的功能,如分析函数,而DB2在OLTP上表现更出色。 2. 分区技术:分区是优化大规模数据性能的关键。Oracle提供了多种分区策略,适应性强,DB2虽然支持较少...

    DB 2数据舱

    DB2是业界领先的关系型数据库产品之一,支持数据仓库、在线分析处理(OLAP)等高级功能。文件中提到了DB2的不同版本,如V7.2,这表明DB2数据库系统随着技术发展不断更新和升级。 文件中还提到了一些DB2的扩展和相关...

    IBM Cognos商业智能解决方案.pptx

    PowerCube结合了Cognos OLAP Server,允许用户进行复杂的OLAP操作,如维度感知、不平衡表处理、OLAP函数和微型图等。同时,Cognos BI服务支持从各种数据源获取信息,包括Oracle、DB2、SQL Server等关系型数据库以及...

    IBM DB2通用数据库SQL入门.pdf

    - **特点**: 易于学习且功能强大,是所有数据库管理员(DBA)和开发人员必须掌握的核心技能之一。 **2. SQL基本语法** - **查询语句**: 使用SELECT语句来检索数据。 - **插入语句**: 使用INSERT INTO语句向表中...

Global site tag (gtag.js) - Google Analytics