与over函数结合的几个函数介绍

本文介绍了SQL中的窗口函数sum() over()的应用场景与方法,并通过具体示例展示了如何根据不同的条件进行数据汇总。此外,还解释了ratio_to_report()函数的作用及使用方式。
--sum()over()的使用
select name,class,s, sum(s)over(partition by class order by s desc) mm from t2 --根据班级进行分数求和
dss        1        95        190  --由于两个95都是第一名,所以累加时是两个第一名的相加
ffd        1        95        190
fda        1        80        270  --第一名加上第二名的
gds        2        92        92
cfe        2        74        166
gf         3        99        198
ddd        3        99        198
3dd        3        78        276
asdf       3        55        331

adf        3        45        376



--ratio_to_report(a)函数用法 Ratio_to_report() 括号中就是分子,over() 括号中就是分母
with a as (select 1 a from dual
           union all
select 1 a from dual
           union  all
select 1 a from dual
           union all
select 2 a from dual
           union all
select 3 a from dual
           union all
select 4 a from dual
           union all
select 4 a from dual
           union all
select 5 a from dual
           )
select a, ratio_to_report(a)over(partition by a) b from a
order by a;

### Oracle 中 `OVER()` 一起使用的分析函数 Oracle 中的 `OVER()` 子句用于定义分析函数的计算范围,它允许在查询结果中为每一行返回一个基于窗口(Window)的聚合值或计算值。 `OVER()` 配合使用的函数主要包括 **分析函数(Analytic Functions)**,这些函数可以提供更复杂的计算能力,包括排名、分布、累计统计等。 以下是一些常见的 `OVER()` 一起使用的分析函数: --- #### 聚合类分析函数 这些函数本质上是聚合函数,但通过 `OVER()` 可以扩展为逐行分析,从而在每行上返回聚合值。 - `SUM()`:计算窗口内的总和 ```sql SELECT ename, sal, deptno, SUM(sal) OVER(PARTITION BY deptno) AS total_sal FROM emp; ``` - `AVG()`:计算窗口内的平均值 ```sql SELECT ename, sal, deptno, AVG(sal) OVER(PARTITION BY deptno) AS avg_sal FROM emp; ``` - `MIN()`:计算窗口内的最小值 ```sql SELECT ename, sal, deptno, MIN(sal) OVER(PARTITION BY deptno) AS min_sal FROM emp; ``` - `MAX()`:计算窗口内的最大值 ```sql SELECT ename, sal, deptno, MAX(sal) OVER(PARTITION BY deptno) AS max_sal FROM emp; ``` - `COUNT()`:计算窗口内的行数 ```sql SELECT ename, deptno, COUNT(*) OVER(PARTITION BY deptno) AS dept_count FROM emp; ``` 这些函数的使用方式传统的聚合函数类似,但结合 `OVER()` 后,它们可以在不减少行数的情况下提供分组统计信息[^3]。 --- #### 排名类分析函数 这些函数用于在数据集中为每一行分配一个排名或序号,常用于排行榜、分组排序等场景。 - `ROW_NUMBER()`:为窗口内的每一行分配唯一的序号 ```sql SELECT ename, sal, deptno, ROW_NUMBER() OVER(PARTITION BY deptno ORDER BY sal DESC) AS rank FROM emp; ``` - `RANK()`:为窗口内的行分配排名,允许并列,但后续排名会跳跃 ```sql SELECT ename, sal, deptno, RANK() OVER(PARTITION BY deptno ORDER BY sal DESC) AS rank FROM emp; ``` - `DENSE_RANK()`:为窗口内的行分配排名,允许并列,但后续排名不跳跃 ```sql SELECT ename, sal, deptno, DENSE_RANK() OVER(PARTITION BY deptno ORDER BY sal DESC) AS dense_rank FROM emp; ``` - `NTILE(n)`:将窗口内的行分成 `n` 组,并为每组分配一个编号 ```sql SELECT ename, sal, deptno, NTILE(4) OVER(PARTITION BY deptno ORDER BY sal DESC) AS quartile FROM emp; ``` 这些函数通常结合 `ORDER BY` 使用,以确保排名的逻辑正确性[^2]。 --- #### 分布类分析函数 这些函数用于计算行在窗口中的分布情况,常用于统计分析。 - `PERCENT_RANK()`:计算某行在其窗口中的相对排名 ```sql SELECT ename, sal, deptno, PERCENT_RANK() OVER(PARTITION BY deptno ORDER BY sal DESC) AS pct_rank FROM emp; ``` - `CUME_DIST()`:计算某行在其窗口中的累积分布 ```sql SELECT ename, sal, deptno, CUME_DIST() OVER(PARTITION BY deptno ORDER BY sal DESC) AS cume_dist FROM emp; ``` - `PERCENTILE_CONT()` 和 `PERCENTILE_DISC()`:用于计算连续或离散的百分位数 ```sql SELECT ename, sal, deptno, PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY sal) OVER(PARTITION BY deptno) AS median_sal FROM emp; ``` 这些函数在金融、市场分析等场景中非常有用,能够提供更深入的数据洞察[^2]。 --- #### 其他特殊分析函数 - `LAG()`:获取当前行之前某一行的值 ```sql SELECT ename, sal, deptno, LAG(sal, 1) OVER(PARTITION BY deptno ORDER BY sal) AS prev_sal FROM emp; ``` - `LEAD()`:获取当前行之后某一行的值 ```sql SELECT ename, sal, deptno, LEAD(sal, 1) OVER(PARTITION BY deptno ORDER BY sal) AS next_sal FROM emp; ``` - `FIRST_VALUE()` 和 `LAST_VALUE()`:获取窗口中的第一个或最后一个值 ```sql SELECT ename, sal, deptno, FIRST_VALUE(sal) OVER(PARTITION BY deptno ORDER BY sal) AS first_sal, LAST_VALUE(sal) OVER(PARTITION BY deptno ORDER BY sal) AS last_sal FROM emp; ``` 这些函数在处理时间序列数据、趋势分析等场景中非常有用,能够轻松实现数据对比和趋势追踪[^3]。 --- #### `LISTAGG()` 作为聚合分析函数 `LISTAGG` 虽然是聚合函数,但也可以结合 `OVER()` 实现分析功能,用于将多行数据合并为一行字符串输出。 ```sql SELECT deptno, LISTAGG(ename, ', ') WITHIN GROUP (ORDER BY ename) OVER(PARTITION BY deptno) AS employees FROM emp ORDER BY deptno, ename; ``` 此功能在生成报告、合并标签等场景中非常实用[^4]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值