窗口函数 CUME_DIST

本文介绍了 SQL 中 CUME_DIST 函数的使用方法,并通过具体示例展示了如何统计小于等于当前值的数据所占比例,包括整体及按部门分组的情况。

说明

CUME_DIST :小于等于当前值的行数/分组内总行数

查询语句

比如,统计小于等于当前薪水的人数,所占总人数的比例

select 
  dept,
  userid,
  sal,
  cume_dist() over (order by sal) as rn1,
  cume_dist() over (partition by dept order by sal) as rn2
from cookie.cookie3;

查询结果

结果说明

rn1: 没有partition,所有数据均为1组,总行数为5,
     第一行:小于等于1000的行数为1,因此,1/5=0.2
     第三行:小于等于3000的行数为3,因此,3/5=0.6
rn2: 按照部门分组,dpet=d1的行数为3,
     第二行:小于等于2000的行数为2,因此,2/3=0.6666666666666666
<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$ ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值