浅谈DB2在线分析处理函数
最近碰到一个测试需求,使用到了在线分析处理(OLAP),现总结记录一下,也希望能帮到有相关问题的朋友。
1. 测试环境是DB2,通过ETL(数据抽取,数据转换,数据加载)技术将数据源数据加载到目标数据仓库。
2. 需求大概意思:验证能否将包含制定商品编码的订单从数据源加载到目标数据库。
3. 目标数据来源于7个不同的应用数据库,每个应用数据库都存储商品编码组相应的订单,其中的50个商品编码相关的订单需要加载到目标仓库。
分析需求后我们得到测试的方法:
1. 在源数据库查询样本订单数据,取得其中所有包含在50个制定商品编码的订单,每个商品编码2条数据用来验证。
2. 通过常规的SQL,我们对订单按照商品编码分类,可以得到Max函数得到最新创建的订单,但这个方法每个商品编码只能得到一条数据,如果需要得到2条,10条数据呢?SQL就感到很吃力了。现在我们可以引入OLAP函数,简单高效的达到业务目标。
SELECT * FROM
(SELECT
DISTINCT RTRIM(A.RECORD_ID),RTRIM(A.PO_ID),RTRIM(A.ANT_ID),B.CAT_ID,B.EXTRACT_DT,ROW_NUMBER()OVER(PARTITION BY B.CAT_ID ORDER BY B.EXTRACT_DT DESC)RN FROM
--retreve 100 POs for each CAT_ID for last year from BDW
(SELECT RECORD_ID,PO_ID,CAT_ID,EXTRACT_DT,ANT_ID FROM TEAME.PO_ITEM
WHERE CAT_ID IN ('4Q6', '4W8', 'S86', 'S89', 'QU39', 'U4Q0', 'UQ41', 'UQ43', 'U89', 'W24', 'YQ44', 'QY45', 'QY50', 'Y5Q1', 'E0W4',
'W72', '8Q3', '0W3','Q75','', 'P74', '', 'P76', '77E', 'P78','E03', 'E05', 'E06', 'E07', 'ED8'
, 'WW9', 'E37', 'WW0', 'DD3', 'DS3', 'E65', '7S4', '', 'CA1', '0QS4', 'W31', '', '9A4', 'Y95', 'QY96')
--AND DATE(EXTRACT_DT) >= DATE(CURRENT_DATE - 365 DAYS) AND DATE(EXTRACT_DT) <= DATE(CURRENT_DATE)
)B,
IP.COM C,
TEAME.PO_IA POIA,
TEAME.PO A LEFT OUTER JOIN TEAME.P_G_M D
ON
D.RECORD_ID = A.RECORD_ID AND
D.PRCHORG_ID = A.PRCHORG_ID AND
D.PRCHGRP_ID = A.PRCHGRP_ID AND
D.PRCHMEM_UNIQ_ID = A.PRCHMEM_UNIQ_ID WHERE
A.RECORD_ID = B.RECORD_ID AND
A.PO_ID = B.PO_ID AND
A.ANT_ID = B.ANT_ID AND
A.RECORD_ID = POIA.RECORD_ID AND A.PO_ID = POIA.PO_ID AND
B.CAT_ID = C.CORPCOMMCODE AND
(COMGROUP IN ('J', 'D')
OR POIA.LEDGACCT_MINOR_NUM IN ('','','','','','','','','FDF','FD'))
AND A.RECORD_ID > ' '
AND DATE(A.EXTRACT_DT) >= DATE(CURRENT_DATE - 365 DAYS) AND DATE(A.EXTRACT_DT) <= DATE(CURRENT_DATE))RN
WHERE RN=1
WITH UR;
接下我们主要来看这一句:ROW_NUMBER()OVER(PARTITION BY B.CAT_ID ORDER BY B.EXTRACT_DT DESC)RN
ROW_NUMBER()这个函数是用来给查询结果集编号,
OVER是一个表达式,它的作用是定义一个作用域(或者可以说是结果集),OVER前面的函数只对OVER定义的结果集起作用,
PARTITION BY用来给结果集分组, 和group by一样。
ORDER BY对分组后子组按某列排序。
最后用条件WHERE RN=2得到买个分组后的每个小组的前两行。
除了这个函数,我们可以扩展一下,了解下其他常用函数:
rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内).
dense_rank()l是连续排序,有两个第二名时仍然跟着第三名。
相比之下row_number是没有重复值的,每组内部排序后的顺序编号(组内连续的唯一的)。
FIRST_VALUE,用来求OVER 定义集合的最小值
LAST_VALUE,用来求OVER 定义集合的最大值。值得注意的是这两个函数有个参数,'IGNORE NULLS' 或 'RESPECT NULLS',用来忽略NULL值和考虑NULL值
OLAP所有其他函数:
ROW_NUMBER
RANK
DENSE_RANK
FIRST_VALUE
LAST_VALUE
LAG
LEAD
COUNT
MIN
MAX
AVG
SUM
ROW_NUMBER
RANK
DENSE_RANK
FIRST_VALUE
LAST_VALUE
LAG
LEAD
COUNT
MIN
MAX
AVG
SUM
浅谈DB2在线分析处理函数的更多相关文章
- DB2 Zos 浅谈 - DB2 LUW VS DB2 Zos
DB2 Zos 浅谈 - DB2 LUW VS DB2 Zos 概述: 各位可能对DB2 LUW了解得比较多,但对DB2 Zos(大机操作系统)知之甚少,因为IBM的内部资料一向是比较封闭的,特别是我 ...
- 浅谈Kotlin中的函数
本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/UV23Uw_969oVhiOdo4ZKAw作者:连凌能 Kotlin,已经被Android官方 ...
- 浅谈 php 采用curl 函数库获取网页 cookie 和 带着cookie去访问 网页的方法!!!!
由于近段时间帮朋友开发一个能够查询正方教务系统的微信公众平台号.有所收获.这里总结下个人经验. 开讲前,先吐槽一下新浪云服务器,一个程序里的 同一个函数 在PC测试可以正常运行,在它那里就会挂的 ...
- 浅谈reverse_iterator的base()函数
非原创,原文链接:http://blog.csdn.net/shuchao/article/details/3705252 调用reverse_iterator的base成员函数可以产生"对 ...
- 浅谈javascript中stopImmediatePropagation函数和stopPropagation函数的区别
在事件处理程序中,每个事件处理程序中间都会有一个event对象,而这个event对象有两个方法,一个是stopPropagation方法,一个是stopImmediatePropagation方法,两 ...
- 浅谈 js中parseInt函数的解析
首先还是从很热门的实例parseInt("09")==0说起. parseInt(number,type)这个函数后面如果不跟第2个参数来表示进制的话,默认是10进制. 比如说pa ...
- 浅谈 js中parseInt函数的解析[转]
首先还是从很热门的实例parseInt("09")==0说起. parseInt(number,type)这个函数后面如果不跟第2个参数来表示进制的话,默认是10进制. 比如说pa ...
- 浅谈DB2的四个隔离级别
隔离级别定义用于控制并发事务的行为,它决定在访问数据时数据是如何锁定的.如何与其他进程隔离的. 包括四个级别,级别从高到低: RR(可重复读取) RS(读取稳定性) CS(游标稳定性) UR(未提交的 ...
- 浅谈assert()函数的用法
#include<stdio.h> #include<assert.h> char * Strcpy(char *dst,const char *src) { assert(d ...
随机推荐
- mac 好用软件地址存储
Navicat Premium 12.0.24 for mac已破解中文 https://www.52pojie.cn/thread-727433-1-1.html sublime 破解方法https ...
- clean code 第一章笔记
我们都曾有过这样的经历:自己写的烂程序竟然可以运行,然后就认为能运行的烂代码总比什么都没有强.还会有这样的想法:总有一天我会修改它.但是,LeBlanc(勒布朗)法则表示:稍后等于永不(Later e ...
- Algorithm——最长公共前缀
一.问题 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow ...
- js数组详解
1,什么是数组 数组是值得有序集合,每个值叫做一个元素,而每个元素在数组中有一个位置,以数字表示,称为索引.js的数组是无类型的,数组元素可以是任意类型,同一个数组中的不同元素可能是对象或数组 ...
- perf4j 监控请求 + traceId区分日志
1. 场景 从request进入Controller到出去的时间, 可以统计接口访问的一些数据,如:平均处理时间.最大处理时间 2. 代码 2.1 mvc-servlet 定义切面和拦截器 <? ...
- Eclipse常用操作
一 Eclipse常用快捷键 ctrl+Q:跳到最后一次编辑处. ctrl+F:在当前文件中查找并替换. ctrl+T:查看类的继承关系. alt+左箭头:返回到光标的上一个位置. alt+右箭头:前 ...
- endwith与startwith字符串方法匹配重写
endwith与startwith字符串方法匹配重写 在js读取文件信息并判断文件的格式类型时出现问题,并找到解决方案,写下来与大家分享,共勉. ---DanlV 描述 本人在上传MP3格式文件时,需 ...
- class 命名规范
本文是从简书复制的, markdown语法可能有些出入, 想看"正版"和更多内容请关注 简书: 小贤笔记 注: 文章摘自 penggelies07- 简书, super晴天 - C ...
- JDBC连接数据库方法的封装,以及查询数据方法的封装
(在上一篇文章中,我们详细的介绍了连接数据库的方法,以及eclipse操作数据库信息的相关方法,在这里我们将主要讲封装.) 主要内容: 一般的连接数据库测试 把连接数据库的方法封装成一个类和测试 一个 ...
- 如何对MySQL数据库中的数据进行实时同步