• 浅谈DB2在线分析处理函数


    最近碰到一个测试需求,使用到了在线分析处理(OLAP),现总结记录一下,也希望能帮到有相关问题的朋友。

    1. 测试环境是DB2,通过ETL(数据抽取,数据转换,数据加载)技术将数据源数据加载到目标数据仓库。

    2. 需求大概意思:验证能否将包含制定商品编码的订单从数据源加载到目标数据库。

    3. 目标数据来源于7个不同的应用数据库,每个应用数据库都存储商品编码组相应的订单,其中的50个商品编码相关的订单需要加载到目标仓库。

    分析需求后我们得到测试的方法:

    1. 在源数据库查询样本订单数据,取得其中所有包含在50个制定商品编码的订单,每个商品编码2条数据用来验证。

    2. 通过常规的SQL,我们对订单按照商品编码分类,可以得到Max函数得到最新创建的订单,但这个方法每个商品编码只能得到一条数据,如果需要得到2条,10条数据呢?SQL就感到很吃力了。现在我们可以引入OLAP函数,简单高效的达到业务目标。

     1 SELECT * FROM
     2 (SELECT 
     3 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
     4 
     5 FROM 
     6 --retreve 100 POs for each CAT_ID for last year from BDW
     7 (SELECT RECORD_ID,PO_ID,CAT_ID,EXTRACT_DT,ANT_ID FROM TEAME.PO_ITEM
     8 WHERE CAT_ID IN ('4Q6', '4W8', 'S86', 'S89', 'QU39', 'U4Q0', 'UQ41', 'UQ43', 'U89', 'W24', 'YQ44', 'QY45', 'QY50', 'Y5Q1', 'E0W4', 
     9 'W72', '8Q3', '0W3','Q75','73', 'P74', '75', 'P76', '77E', 'P78','E03', 'E05', 'E06', 'E07', 'ED8'
    10 , 'WW9', 'E37', 'WW0', 'DD3', 'DS3', 'E65', '7S4', '45', 'CA1', '0QS4', 'W31', '64', '9A4', 'Y95', 'QY96')
    11 --AND DATE(EXTRACT_DT) >= DATE(CURRENT_DATE - 365 DAYS) AND DATE(EXTRACT_DT) <= DATE(CURRENT_DATE)
    12 )B,
    13 IP.COM C, 
    14 TEAME.PO_IA POIA,
    15 TEAME.PO A
    16 
    17 LEFT OUTER JOIN TEAME.P_G_M D 
    18 ON 
    19 D.RECORD_ID = A.RECORD_ID AND
    20 D.PRCHORG_ID = A.PRCHORG_ID AND
    21 D.PRCHGRP_ID = A.PRCHGRP_ID AND
    22 D.PRCHMEM_UNIQ_ID = A.PRCHMEM_UNIQ_ID 
    23 
    24 WHERE 
    25 A.RECORD_ID = B.RECORD_ID AND
    26 A.PO_ID = B.PO_ID AND
    27 A.ANT_ID = B.ANT_ID AND
    28 A.RECORD_ID = POIA.RECORD_ID AND
    29 
    30 A.PO_ID = POIA.PO_ID AND
    31 B.CAT_ID = C.CORPCOMMCODE AND
    32 (COMGROUP IN ('J', 'D') 
    33     OR POIA.LEDGACCT_MINOR_NUM IN ('123','422','1','21','324','123','442','123','FDF','FD'))
    34 AND A.RECORD_ID > '   '  
    35 AND DATE(A.EXTRACT_DT) >= DATE(CURRENT_DATE - 365 DAYS) AND DATE(A.EXTRACT_DT) <= DATE(CURRENT_DATE))RN
    36 WHERE RN=1
    37 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

  • 相关阅读:
    datatime模块
    快速幂
    | 与|| ,& 与&&
    sql----order by
    pandas iterrows()
    黄包车比赛 python学习
    右键git-bash不能使用
    17flask分页
    16flask错误处理
    15跨站请求伪造
  • 原文地址:https://www.cnblogs.com/clarke157/p/6575788.html
Copyright © 2020-2023  润新知