zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    python算法(1)抓交通肇事犯
    vue(24)网络请求模块axios使用
    vue(23)Vuex的5个核心概念
    vue(22)Vuex的安装与使用
    JMeter分布式压测配置(五)
    命令行执行Jmeter脚本(四)
    BeanShell(二)
    Jmeter之测试片段(八)
    服务器资源监控之Perfmon
    Jmeter之线程组(四)
  • 原文地址:https://www.cnblogs.com/thomasbc/p/15682082.html
Copyright © 2011-2022 走看看