• oracle:分析函数(评级函数、窗口函数等)


    1.评级函数:

    用于等级、百分点、n分片等。

    函数

    说明

    RANK()

    返回数据项在分组中的排名,排名相等会在名次中留下空位

    DENSE_RANK()

    返回数据项在分组中的排名,排名相等会在名次中不会留下空位

    CUME_DIST()

    返回特定值对于一组值的位置“cumulative distribution”(累积分布)

    PERCENT_RANK()(

    返回某个值相对于一组值的百分比排名

    NTILE()

    返回n分片后的值

    ROW_NUMBER()

    为每条记录返回一个数字

    • RANK()、DENSE_RANK()

    RANK()在出现等级相同的元素时预留为空,DENSE_RANK()不会。

    Eg:某产品类型有两个并列第一

    RANK():第一二为1,第三位3

    DENSE_RANK():第一二为1,第三位2

    1 SELECT
    2 column_name,
    3 RANK() OVERORDER BY column_name DESCAS rank,
    4 DENSE_RANK() OVERORDER BY SUM(column_name) DESCAS dense_rank
    5 FROM table_name

    OVER 需要,括号内为编号顺序
    注意:order by 时,desc NULL 值排在首位,ASC时NULL值排在末尾

    可以通过NULLS LAST、NULLS FIRST 控制

    RANK() OVER (ORDER BY column_name DESC NULLS LAST)

    PARTITION BY 分组排列顺序

    RANK() OVER(PARTITION BY month ORDER BY column_name DESC)

    这样,就会按照month 来分,即所需要排列的信息先以month 的值来分组,在分组中排序,各个分组间不干涉

    ROLLUP、CUBE、GROUP SETS (只显示小计信息) 与 RANK() 结合使用

    •  CUME_DIST()、PERCENT_RANK()

    反百分比函数:PERCENTILE_DISC(x), PERCENTILE_CONT(x)

    • NTILE()

     

    • ROW_NUMBER()

    ROW_NUMBER()从1开始,为每条记录返回一个数字

    SELECT
    ROW_NUMBER() OVER (ORDER BY column_name DESC)AS row_name
    FROM table_name;


    2.窗口函数:

    可以计算一定范围内、一定值域内、或者一段时间内的累积和以及移动平均值等。

    可以结合聚集函数SUM() 、AVG() 等使用。

    可以结合FIRST_VALUE() 和LAST_VALUE(),返回窗口的第一个和最后一个值

    • 计算累积和:


    eg:统计1-12月的累积销量,即1月为1月份的值,2月为1.2月份值的和,3月为123月份的和,12月为1-12月份值的和

    SELECT
    month,SUM(amount) month_amount,
    SUM( SUM(amount)) OVER (ORDER BY month ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_amount
    FROM table_name
    GROUP BY month
    ORDER BY month;
    其中:
    SUM
    ( SUM(amount)) 内部的SUM(amount)为需要累加的值,在上述可以换为 month_amount
    ORDER BY month 按月份对查询读取的记录进行排序,就是窗口范围内的排序
    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 定义起点和终点,UNBOUNDED PRECEDING 为起点,表明从第一行开始, CURRENT ROW为默认值,就是这一句等价于:
    ROWS UNBOUNDED PRECEDING
    PRECEDING:在前  的意思。
    FOLLOWING: 在后 的意思。

    计算前3个月之间的和
    SUM( SUM(amount)) OVER (ORDER BY month ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) AS cumulative_amount
    也可以
    SUM( SUM(amount)) OVER (ORDER BY month 3 PRECENDING) AS cumulative_amount

    前后一个月之间的和
    SUM( SUM(amount)) OVER (ORDER BY month ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS cumulative_amount

    窗体第一条和最后一条的值
    FIRST_VALUE(SUM(amount)) OVER (ORDER BY month ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS xxxx;

    LAST_VALUE(SUM(amount)) OVER (ORDER BY month ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS xxxx;
    这样就可以获得该行上一行和下一行的值


    3.报表函数:
    用于执行跨越分组和组内分区的计算 (这里的组应该指的是 ORDER BY 的分组)
    SUM(column_name1) OVER(PARTITION BY  column_name2)
    这样,会将数据按column_name2分组,然后求column_name1的和,但在表输出的时候是按ORDER BY 格式输出
    这样输出列会重复,例如相同的column_name2 会输出相同的column_name1


    4.LAG()、LEAD()
    获得相对于当前记录指定距离的那条记录的数据
    LAG()为向前、LEAD()为向后
    LAG(column_name1,1) OVER(ORDER BY column_name2)

    LEAG(column_name1,1) OVER(ORDER BY column_name2)
    这样就获得前一条、后一条的数据

    5.FIRST、LAST

     获得一个排序分组中的第一个值和组后一个值。可以与分组分组函数结合。

    SELECT
    MIN(month) KEEP(DENSE_RANK FIRST ORDER BY SUM(amount)) AS highest_sales_month,
    MIN(month) KEEP(DENSE_RANK LAST ORDER BY SUM(amount)) AS lows_sales_month
    FROM table_name
    GROUP BY month
    ORDER BY month;

    这样就可以求得一年中销量最高和最低的月份。
    注意:输出的是月份,但是用SUM(amount)来判断。

    6.使用线性回归函数

    7.使用假想评级与分布函数

     

  • 相关阅读:
    20145224&20145238 《信息安全系统设计基础》 第四次实验
    20145224&20145238 《信息安全系统设计基础》 第三次实验
    《信息安全系统设计基础》 第十一周学习总结
    20145211《信息安全系统设计基础》实验二 固件设计
    20145211《信息安全系统设计基础》实验五 网络通信
    20145211《信息安全系统设计基础》课程总结
    20145211 《信息安全系统设计基础》第十四周学习总结
    20145211 《信息安全系统设计基础》第十三周学习总结
    20145211《信息安全系统设计基础》第十二周学习总结
    GDB调试汇编堆栈过程分析
  • 原文地址:https://www.cnblogs.com/Azhu/p/2438346.html
Copyright © 2020-2023  润新知