微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

oracle:分析函数评级函数、窗口函数等

1.评级函数

用于等级、百分点、n分片等。

函数

说明

RANK()

返回数据项在分组中的排名,排名相等会在名次中留下空位

DENSE_RANK()

返回数据项在分组中的排名,排名相等会在名次中不会留下空位

CUME_disT()

返回特定值对于一组值的位置“cumulative distribution”(累积分布)

PERCENT_RANK()(

返回某个值相对于一组值的百分比排名

NTILE()

返回n分片后的值

ROW_NUMBER()

为每条记录返回一个数字

  • RANK()、DENSE_RANK()

RANK()在出现等级相同的元素时预留为空,DENSE_RANK()不会。

Eg:某产品类型有两个并列第一

RANK():第一二为1,第三位3

DENSE_RANK():第一二为1,第三位2

1 SELECT
2 column_name,
3 RANK() OVERORDER BY column_name DESCAS rank,128); line-height:1.5!important">4 DENSE_RANK() BY SUM(column_name) AS dense_rank
5 FROM table_name

OVER 需要,括号内为编号顺序
注意:order by 时,desc NULL 值排在首位,ASC时NULL值排在末尾

可以通过NULLS LAST、NULLS FirsT控制

RANK() OVER (DESC NULLS LAST)

PARTITION BY分组排列顺序

OVER(PARTITION month DESC)

这样,就会按照month 来分,即所需要排列的信息先以month 的值来分组,在分组中排序,各个分组间不干涉

ROLLUP、CUBE、GROUP SETS (只显示小计信息) 与 RANK() 结合使用

  • CUME_disT()、PERCENT_RANK()

反百分比函数percentile_disC(x),percentile_CONT(x)

  • NTILE()

  • ROW_NUMBER()

ROW_NUMBER()从1开始,为每条记录返回一个数字

SELECT
ROW_NUMBER() OVER (DESC)AS row_name
FROM table_name;


2.窗口函数:

可以计算一定范围内、一定值域内、或者一段时间内的累积和以及移动平均值等。

可以结合聚集函数SUM() 、AVG() 等使用。

可以结合FirsT_VALUE() 和LAST_VALUE(),返回窗口的第一个和最后一个

  • 计算累积和:


eg:统计1-12月的累积销量,即1月为1月份的值,2月为1.2月份值的和,3月为123月份的和,12月为1-12月份值的和

SELECT
month,SUM(amount) month_amount,
SUM( SUM(amount)) month ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_amount
FROM table_name
GROUP month
month;
其中:
SUM
( SUM(amount)) 内部的SUM(amount)为需要累加的值,在上述可以换为 month_amount
ORDER BY month 按月份对查询读取的记录进行排序,就是窗口范围内的排序
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 定义起点和终点,UNBOUNDED PRECEDING 为起点,表明从第一行开始,CURRENT ROW为认值,就是这一句等价于:
ROWS UNBOUNDED PRECEDING
PRECEDING:在前  的意思。
FOLLOWING: 在后 的意思。

计算前3个月之间的
BETWEEN 3 PRECEDING AS cumulative_amount
也可以
month 3 PRECENDING) AS cumulative_amount

前后一个月之间的
1 PRECEDING AND 1 FOLLOWING) AS cumulative_amount

窗体第一条和最后一条的值
FirsT_VALUE(AS xxxx;

LAST_VALUE(AS xxxx;
这样就可以获得该行上一行和下一行的值


3.报表函数
用于执行跨越分组和组内分区的计算 (这里的组应该指的是 ORDER BY 的分组)
SUM(column_name1) BY column_name2)
这样,会将数据按column_name2分组,然后求column_name1的和,但在表输出的时候是按ORDER BY 格式输出
这样输出列会重复,例如相同的column_name2 会输出相同的column_name1


4.LAG()、LEAD()
获得相对于当前记录指定距离的那条记录的数据
LAG()为向前、LEAD()为向后
LAG(column_name1,1) OVER(BY column_name2)

LEAG(column_name1,255); line-height:1.5!important">BY column_name2)
这样就获得前一条、后一条的数据

5.FirsT、LAST

获得一个排序分组中的第一个值和组后一个值。可以与分组分组函数结合。

MIN(month) KEEP(DENSE_RANK FirsT AS highest_sales_month,255); line-height:1.5!important">month) KEEP(DENSE_RANK LAST AS lows_sales_month
month;

这样就可以求得一年中销量最高和最低的月份。
注意:输出的是月份,但是用SUM(amount)来判断。

6.使用线性回归函数

7.使用假想评级与分布函数

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐