窗口函数之排名函数与分析函数

2024-06-23 13:08
文章标签 分析 函数 窗口 排名

本文主要是介绍窗口函数之排名函数与分析函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

窗口函数中的排名函数与分析函数实在是太好用了,尤其是row_number和lead

全局表如下:

排名函数

1.row_number

ROW_NUMBER() over (partition by name order by testid)       (partition by 是可选的)   其他排名函数相同
 按照order排序  返回顺序       
select ROW_NUMBER() over(order by col1) rowNumber,* from t1

select ROW_NUMBER() over(partition by col1 order by col1) rowNumber,* from t1


2.rank

按照order排序 返回排名,相同情况下排名相同
select rank() over(order by col1) rank_,* from t1
select rank() over(partition by col1 order by col1) rank_,* from t1

3.dense_rank

看图比较和rank的区别
select dense_rank() over(order by col1) rank_,* from t1

4.ntile

ntile函数,将数据强制分成n份,可结合case when 转为阶段百分比
例如:25%,50%等
select ntile(4) over(order by col1) rank_,* from t1


分析函数

1.cume_dist

计算累计分布 ,计算某指定值在一组值中的相对位置,值相同的情况按照最后一个值的位置计算
select cume_dist() over(order by col1) as cume_dist,* from t1

2.first_value 3.last_value

取首尾数据
这个我在别的地方看到一个很好的解释,就不再重复实验了
例:查询部门最早发生销售记录日期和最近发生的销售记录日期
SQL> select *from criss_sales order by dept_id,sale_date;DEPT_ID SALE_DATE   GOODS_TYPE    SALE_CNT
------- ----------- ---------- -----------
D01     2014/3/4    G00                700
D01     2014/4/8    G01                200
D01     2014/4/30   G03                800
D01     2014/5/4    G02                 80
D01     2014/6/12   G01        
D02     2014/3/6    G00                500
D02     2014/4/8    G02                100
D02     2014/4/27   G01                300
D02     2014/5/2    G03                900
SQL> select2     dept_id3    ,sale_date4    ,goods_type5    ,sale_cnt6    ,first_value(sale_date) over (partition by dept_id order by sale_date) first_value7    ,last_value(sale_date) over (partition by dept_id order by sale_date desc) last_value8  from criss_sales;DEPT_ID SALE_DATE   GOODS_TYPE    SALE_CNT FIRST_VALUE LAST_VALUE
------- ----------- ---------- ----------- ----------- -----------
D01     2014/3/4    G00                700 2014/3/4    2014/3/4
D01     2014/4/8    G01                200 2014/3/4    2014/4/8
D01     2014/4/30   G03                800 2014/3/4    2014/4/30
D01     2014/5/4    G02                 80 2014/3/4    2014/5/4
D01     2014/6/12   G01                    2014/3/4    2014/6/12
D02     2014/3/6    G00                500 2014/3/6    2014/3/6
D02     2014/4/8    G02                100 2014/3/6    2014/4/8
D02     2014/4/27   G01                300 2014/3/6    2014/4/27
D02     2014/5/2    G03                900 2014/3/6    2014/5/2

看结果first_value()很直观,不用多解释
但是,last_value()值,部门D01不是应该为2014/6/12,部门D02不是应该为2014/5/2吗?为什么会每条记录都不一样?
可以这样去理解:last_value()默认统计范围是 rows between unbounded preceding and current row
验证一下:
SQL> select2     dept_id3    ,sale_date4    ,goods_type5    ,sale_cnt6    ,first_value(sale_date) over (partition by dept_id order by sale_date) first_value7    ,last_value(sale_date) over (partition by dept_id order by sale_date desc) last_value8    ,last_value(sale_date) over (partition by dept_id order by sale_date rows between unbounded preceding and unbounded following) last_value_all9  from criss_sales;DEPT_ID SALE_DATE   GOODS_TYPE    SALE_CNT FIRST_VALUE LAST_VALUE  LAST_VALUE_ALL
------- ----------- ---------- ----------- ----------- ----------- --------------
D01     2014/3/4    G00                700 2014/3/4    2014/3/4    2014/6/12
D01     2014/4/8    G01                200 2014/3/4    2014/4/8    2014/6/12
D01     2014/4/30   G03                800 2014/3/4    2014/4/30   2014/6/12
D01     2014/5/4    G02                 80 2014/3/4    2014/5/4    2014/6/12
D01     2014/6/12   G01                    2014/3/4    2014/6/12   2014/6/12
D02     2014/3/6    G00                500 2014/3/6    2014/3/6    2014/5/2
D02     2014/4/8    G02                100 2014/3/6    2014/4/8    2014/5/2
D02     2014/4/27   G01                300 2014/3/6    2014/4/27   2014/5/2
D02     2014/5/2    G03                900 2014/3/6    2014/5/2    2014/5/2全统计的情况下得到的last_value()值,部门D01为2014/6/12,部门D02为2014/5/2

4.lag  5.lead

取第前n行或第后n行,越界值用默认值代替
三个参数 列名  偏移量  默认值
SQL> select *  from kkk;                                          ID NAME                                                   
---------- --------------------                                   1 1name                                                  2 2name                                                  3 3name                                                  4 4name                                                  5 5name                                                  SQL> select id,name,lag(name,1,0) over ( order by id )  from kkk; ID NAME                 LAG(NAME,1,0)OVER(ORDERBYID)      
---------- -------------------- ----------------------------      1 1name                0                                 2 2name                1name                             3 3name                2name                             4 4name                3name                             5 5name                4name                             SQL> select id,name,lead(name,1,0) over ( order by id )  from kkk;ID NAME                 LEAD(NAME,1,0)OVER(ORDERBYID)     
---------- -------------------- -----------------------------     1 1name                2name                             2 2name                3name                             3 3name                4name                             4 4name                5name                             5 5name                0                                 SQL>  
SQL> select id,name,lead(name,2,0) over ( order by id )  from kkk;                                                            ID NAME                 LEAD(NAME,2,0)OVER(ORDERBYID)     
---------- -------------------- -----------------------------     1 1name                3name                             2 2name                4name                             3 3name                5name                             4 4name                0                                 5 5name                0                                 SQL> 
SQL> select id,name,lead(name,1,'alsdfjlasdjfsaf') over ( order by id )  from kkk;                                                             ID NAME                 LEAD(NAME,1,'ALSDFJLASDJFSAF')                    
---------- -------------------- ------------------------------                    1 1name                2name                                             2 2name                3name                                             3 3name                4name                                             4 4name                5name                                             5 5name                alsdfjlasdjfsaf           

这篇关于窗口函数之排名函数与分析函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1087248

相关文章

MySQL 中的 CAST 函数详解及常见用法

《MySQL中的CAST函数详解及常见用法》CAST函数是MySQL中用于数据类型转换的重要函数,它允许你将一个值从一种数据类型转换为另一种数据类型,本文给大家介绍MySQL中的CAST... 目录mysql 中的 CAST 函数详解一、基本语法二、支持的数据类型三、常见用法示例1. 字符串转数字2. 数字

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

MySQL count()聚合函数详解

《MySQLcount()聚合函数详解》MySQL中的COUNT()函数,它是SQL中最常用的聚合函数之一,用于计算表中符合特定条件的行数,本文给大家介绍MySQLcount()聚合函数,感兴趣的朋... 目录核心功能语法形式重要特性与行为如何选择使用哪种形式?总结深入剖析一下 mysql 中的 COUNT

MySQL 中 ROW_NUMBER() 函数最佳实践

《MySQL中ROW_NUMBER()函数最佳实践》MySQL中ROW_NUMBER()函数,作为窗口函数为每行分配唯一连续序号,区别于RANK()和DENSE_RANK(),特别适合分页、去重... 目录mysql 中 ROW_NUMBER() 函数详解一、基础语法二、核心特点三、典型应用场景1. 数据分

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

Python get()函数用法案例详解

《Pythonget()函数用法案例详解》在Python中,get()是字典(dict)类型的内置方法,用于安全地获取字典中指定键对应的值,它的核心作用是避免因访问不存在的键而引发KeyError错... 目录简介基本语法一、用法二、案例:安全访问未知键三、案例:配置参数默认值简介python是一种高级编

python 常见数学公式函数使用详解(最新推荐)

《python常见数学公式函数使用详解(最新推荐)》文章介绍了Python的数学计算工具,涵盖内置函数、math/cmath标准库及numpy/scipy/sympy第三方库,支持从基础算术到复杂数... 目录python 数学公式与函数大全1. 基本数学运算1.1 算术运算1.2 分数与小数2. 数学函数