高级查询 cume_dist()和percent_rank()

本文通过具体实例对比解析了SQL中的cume_dist()和percent_rank()两个窗口函数的区别及使用方法,详细介绍了这两种函数的计算原理及其应用场景。
 

cume_dist()和percent_rank()这两个函数了,现在把他们的区别在这用个例子说明一下


SQL> create table cume (
  2  id integer,
  3  value number(8,2),
  4  name varchar2(30));

Table created.

SQL>
SQL> select  * from cume;

        ID      VALUE NAME
---------- ---------- ------------------------------------------------------------
         1        123 t1
         2        234 t2
         2        234 t21
         3        345 t3
         4        456 t4
         5        567 t5
         6        567 t6

7 rows selected.

SQL>
SQL> select id, value, cume_dist() over (order by value desc) as cume_dist, percent_rank() over (order by value desc) as percent_rank from cume;

        ID      VALUE  CUME_DIST PERCENT_RANK
---------- ---------- ---------- ------------
         5        567 .285714286            0
         6        567 .285714286            0
         4        456 .428571429   .333333333
         3        345 .571428571           .5
         2        234 .857142857   .666666667
         2        234 .857142857   .666666667
         1        123          1            1

7 rows selected.
数字看着不是很整齐,我们处理下
SQL> delete from cume where id = 2;

2 rows deleted.

SQL> select id, value, cume_dist() over (order by value desc) as cume_dist, percent_rank() over (order by value desc) as percent_rank from cume;

        ID      VALUE  CUME_DIST PERCENT_RANK
---------- ---------- ---------- ------------
         5        567         .4            0
         6        567         .4            0
         4        456         .6           .5
         3        345         .8          .75
         1        123          1            1

SQL>
从上面的例子我们可以看出cume_dist()函数统计的范围是0< cume_dist() <=1,但是取不到0。percent_rank()也是0<= percent_rank() <=1,0和1都可以取道的。
cume_disk()的计算公式应该是 = ((统计的列的种类)/(统计的列的总数))*每个重复种类中的个数;如value值为567的两个值,公式就是(4/5)*2=0.4。而最大就是1了
percetn_rank()的计算公式应该是 = ((统计的列的种类)/(统计的列的总数))*100%,但是第一个总是从0开始的,不管是重复几次,要是567有4次,那就是有四个都是0,最后一个是1。

<think>好的,我需要解释CUME_DIST()函数的用法。首先,这个函数属于窗口函数中的分布函数,用于计算某个值在数据集中的累积分布。用户可能想知道它的基本语法、参数应用场景。 根据引用[3][4],CUME_DIST()计算的是当前行及其之前所有行占整个分区的比例,即相对位置。例如,如果有6行数据,当前行是第3行,那么CUME_DIST()的结果是3/6=0.5。不过要注意,引用[4]提到的是“当前行数占所有行数的百分比”,这里可能需要澄清是到当前行为止的累计比例。此外,引用[3]中的示例说明结果的计算方式,比如第三行的结果是0.4,可能因为分区内的总行数不同或者排序影响。 接下来需要整理函数的语法结构。引用[1]提到LEAD()函数的语法,可以推断CUME_DIST()的语法类似,即不需要参数,但需要OVER子句指定分区排序。例如: CUME_DIST() OVER (PARTITION BY expr ORDER BY expr) 应用场景方面,引用[3][4]指出它适用于统计分析,比如确定学生的成绩分布或销售人员的业绩排名百分比。同时,引用[5]提到Pandas实现类似功能,可能用户也想知道如何在其他工具中使用,但当前问题聚焦于数据库中的用法。 还需要注意PERCENT_RANK()的区别。根据引用[3],PERCENT_RANK的计算公式是(rank-1)/(rows-1),而CUME_DIST()是当前行的位置除以总行数。例如,当排序相同时,CUME_DIST()会将这些行视为同一位置,导致结果相同。 最后,用户可能需要示例来更好地理解。例如,引用[3]中的SQL示例展示了不同函数的结果对比,可以引用这个例子来说明CUME_DIST()的具体输出。</think>### CUME_DIST() 函数详解 #### 1. 函数定义 $CUME\_DIST()$ 是 MySQL 中的窗口函数,用于**计算当前行在分区内的累积分布**,即当前行及其之前行的数量占分区总行数的比例。公式为: $$CUME\_DIST() = \frac{\text{当前行的位置}}{\text{分区总行数}}$$ 其中“位置”由 `ORDER BY` 排序决定,相同值视为同一位置[^3][^4]。 --- #### 2. 语法结构 ```sql CUME_DIST() OVER ( PARTITION BY <分区字段> ORDER BY <排序字段> [ASC|DESC] ) ``` - **PARTITION BY**:将数据划分为多个独立分区(可选) - **ORDER BY**:定义分区内数据的排序规则(必选) --- #### 3. 与 PERCENT_RANK() 的区别 | 函数 | 公式 | 取值范围 | 特点 | |------------------|--------------------------|------------|--------------------------| | $CUME\_DIST()$ | $\frac{\text{位置}}{N}$ | $[0,1]$ | 计算累积分布,包含相同值 | | $PERCENT\_RANK()$ | $\frac{rank-1}{N-1}$ | $[0,1]$ | 计算相对排名百分比 | 示例:若某分区有 6 行数据,排序后第三行的计算结果: - $CUME\_DIST() = 3/6 = 0.5$ - $PERCENT\_RANK() = (3-1)/(6-1) = 0.4$[^4] --- #### 4. 应用场景 1. **成绩分布分析** 计算学生成绩的累积百分比,如“成绩≤80分的学生占比” ```sql SELECT student_id, score, CUME_DIST() OVER (ORDER BY score DESC) AS percentile FROM exam_results; ``` 2. **销售排名统计** 统计销售人员的业绩在部门内的累积分布 ```sql SELECT salesperson, revenue, CUME_DIST() OVER (PARTITION BY department ORDER BY revenue DESC) AS top_percent FROM sales_data; ``` --- #### 5. 实际示例 通过员工薪资表演示函数效果(引用自示例数据[^3]): ```sql SELECT dname, ename, salary, CUME_DIST() OVER (PARTITION BY dname ORDER BY salary DESC) AS cume_dist FROM employee; ``` 结果说明: | 部门 | 员工 | 薪资 | cume_dist | |-------|------|------|-----------| | 研发部 | 张三 | 9000 | 0.5 | | 研发部 | 李四 | 8000 | 1.0 | | 销售部 | 王五 | 7000 | 0.33 | - **研发部**:总行数=2,李四的 $CUME\_DIST()=2/2=1.0$ - **销售部**:总行数=3,王五的 $CUME\_DIST()=3/3=1.0$ ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值