• oracle窗口函数cume_dist() 、nth_value()、ntile()


    CUME_DIST() 是累计分布函数中的一种,另外还有NTH_VALUE()与 NTILE()

    1.CUME_DIST()是一个计算公式的结果值,

    公式:当升序排列,计算小于等于当前值的行数/总行数(number of rows ≤ current row)/(total number of rows)。

               当降序排列,计算大于等于当前值的行数/总行数。

    拿个具体的例子来说:

    某表的结构与表数据如上图

    求: 按部门统计小于等于当前工资的人数占部门总人数的比例

    select name,dept,salary,cume_dist() over (partition by product_type order by sale_price desc)  as result from salary;

    select name,dept,salary,cume_dist() over (partition by product_type order by sale_price asc)  as result from salary;

    2.NTH_VALUE() :取指定排名行的数据

    语法:NTH_VALUE (measure_expr, n) 

    [ FROM { FIRST | LAST } ][ { RESPECT | IGNORE } NULLS ] OVER (analytic_clause)

    以前版本的分析函数,提供了FIRST_VALUE和LAST_VALUE的功能,而11gr2中,Oracle增加了一个NTH_VALUE的功能,这个功能包含了FIRST_VALUE和LAST_VALUE的功能,同时还可以取任意的正数或倒数的记录 。

    select ID, NAME ,DEPT,
    nth_value(NAME,3)  over (order by ID)  as A
    nth_value(NAME ,4) over (order by ID)  as B
    nth_value(NAME ,1) from first over (order by ID)  as C
    nth_value(NAME ,2) from first over (partition by DEPT order by ID)  as D,
    nth_value(NAME ,2) FROM   FIRST  over (order by ID)  as E,
    nth_value(NAME ,4) FROM   LAST   over (order by ID)  as F
     from salary 

    结果是:

     1.从上面的查询结果我们可以看出nth_value(product_name,3)是根据后面的分组的原则(分组或者不分组)找到已product_name排序的第三个值作为该列的值,如果没取到该值为空

    tips:在刚接触窗口函数的时候,曾写过下面的SQL,目的是查询根据id排序第三名的数据

    SELECT  * FROM salary   WHERE row_number() over (order by id)=3

    但是上面的函数报错提示:ORA-30483:window函数在此禁用

    现在来看,上面的nth_value(NAME,3) over (order by ID) 就正好解决了这个问题

    2.nth_value(NAME ,1) from first over (order by ID) 是根据查询出的排序结果取第一行数据的值作为该列的值,如果没取到该值为空

    3.nth_value(NAME ,4) FROM LAST over (order by ID) 这个的用法是从排序的是4名开始往后取依次错开作为该行的值

    疑问:FROM LAST 与FROM FIRST在作用上没对应?

    3.NTILE()    根据设定的组数对记录进行平均分组并编号,不能完全分组的继续从1开始往下编

    select ID, NAME ,DEPT,
    ntile(NAME,1)  over (order by ID)  as A,
    ntile(NAME,2)  over (order by ID)  as B,
    ntile(NAME,3)  over (order by ID)  as C,
    ntile(NAME,4)  over (order by ID)  as D,
    ntile(NAME,5)  over (order by ID)  as E,
    ntile(NAME ,3) over (partition by DEPT order by ID)  as AA
     from salary 

    结果值:

    窗口函数完整篇:https://www.cnblogs.com/thomasbc/p/15131611.html

  • 相关阅读:
    p3c安装使用 编码规范扫描 阿里巴巴出品,挺好用的
    Ideal test 不执行main方法了
    Maven 3-Maven依赖版本冲突的分析及解决小结
    (String)强制转换、toString()和String.valueOf()的区别
    Linux tail 命令详解
    iconv的安装和使用
    daemon函数的原理及使用详解
    SQL Sever 2012 如何建立数据库连接
    Navicat Premium 将sqlserver 数据库 导入mysql 中
    MySQL也有潜规则 – Select 语句不加 Order By 如何排序?
  • 原文地址:https://www.cnblogs.com/thomasbc/p/15682082.html
Copyright © 2020-2023  润新知