首页 > 其他分享 >over() (分析函数)

over() (分析函数)

时间:2025-01-21 08:59:00浏览次数:1  
标签:分析 salary 函数 over partition rank rownumber team

目录
聚合函数(如 sum()、max() 等)可以计算基于组的某种聚合值,但是聚合函数对于某个组只能返回一行记录。若想对于某组返回多行记录,则需要使用分析函数

演示数据

create table rownumber(
       id varchar(10) not null,
       name varchar(10) null,
       age varchar(10) null,
       salary int null,
       team varchar(10) null
);

insert into rownumber(id,name,age,salary,team) values(1,'a',10,8000, 'a');
insert into rownumber(id,name,age,salary,team) values(2,'a2',11,7500, 'a');
insert into rownumber(id,name,age,salary,team) values(3,'b',12,7500, 'b');
insert into rownumber(id,name,age,salary,team) values(4,'b2',13,4500, 'b');
insert into rownumber(id,name,age,salary,team) values(5,'c',14,8000, 'c');
insert into rownumber(id,name,age,salary,team) values(6,'c2',15,20000, 'c');
insert into rownumber(id,name,age,salary,team) values(7,'d',16,30000, 'd');
insert into rownumber(id,name,age,salary,team) values(8,'d2',17,8000, 'd');

select * from rownumber;

![[Pasted image 20241202143656.png]]

rank()/dense_rank()

rank()/dense_rank over(partition by ... order by ...)

说明:

  • over() 在什么条件之上;
  • partition by 按哪个字段划分组(如果要分组必须,有此关键字 partition);
  • order by 按哪个字段排序;
    注意:
  • 使用 rank()/dense_rank() 时,必须要带 order by 否则非法
  • rank()/dense_rank() 分级的区别:

rank(): 跳跃排序,如果有两个第一级时,接下来就是第三级。
dense_rank():连续排序,如果有两个第一级时,接下来仍然是第二级。

示例

根据 salary 排序,跳过同级

select 
	id, 
	name, 
	age, 
	salary, 
	team, 
	rank() over(order by salary desc) as "rank" 
from rownumber

![[Pasted image 20241202142224.png]]

根据 salary 排序,不跳过同级

select 
	id, 
	name, 
	age, 
	salary, 
	team, 
	dense_rank() over(order by salary desc) as "rank" 
from rownumber

![[Pasted image 20241202142235.png]]

min()/max()

min()/max() over(partition by ... order by ...)

说明:

  • over() 在什么条件之上;
  • partition by 按哪个字段划分组(如果要分组必须,有此关键字 partition);
  • order by 按哪个字段排序;

示例

取每个 team 中 salary 最大的

select * from 
	(select id, name, age, salary, team, max(salary) over(partition by team order by salary desc) as "rank" from rownumber) res 
where res.rank = res.salary;

![[Pasted image 20241202142210.png]]

取每个 team 中 salary 最小的

select * from 
	(
		select 
			id, 
			name, 
			age, 
			salary, 
			team, 
			min(salary) over(partition by team order by salary asc) as "rank" 
		from rownumber
	) res 
where res.rank = res.salary;

![[Pasted image 20241202142036.png]]

lead()/lag()

lead()/lag() over(partition by ... order by ...) 

前面/后面n行记录说明:

  • lead(列名,n,m): 当前记录后面第 n 行记录的列名的值,没有则默认值为 m;如果不带参数 n,m,则查找当前记录后面第一行的记录列名的值,没有则默认值为 null。
  • lag(列名,n,m): 当前记录前面第n行记录的列名的值,没有则默认值为m;如果不带参数 n,m,则查找当前记录前面第一行的记录列名的值,没有则默认值为 null

示例

查询 salary 与比自己高一位、低一位的 salary 的差额

select 
	id, 
	name, 
	age, 
	salary, 
	team, 
	lead(salary, 1, 0) over(partition by team order by salary asc) as lead_sal, --记录后面第n行记录
	lag(salary, 1, 0) over(partition by team order by salary asc) as lag_sal --记录前面第N行记录
from rownumber;

![[Pasted image 20241202142718.png]]

first_value()/last_value()

取首尾记录

first_value()/last_value() over(partition by ... order by ...) 

示例

select 
	id, 
	name, 
	age, 
	salary, 
	team, 
	first_value(salary) over(partition by team) as first_sal,
	last_value(salary) over(partition by team) as last_sal
from rownumber;

![[Pasted image 20241202143155.png]]

row_number()

row_number() over(partition by ... order by ...) 

排序(应用:分页)

示例

select 
	id, 
	name, 
	age, 
	salary, 
	team, 
	row_number() over(partition by team order by salary) as row_num
from rownumber;

![[Pasted image 20241202143434.png]]

sum/avg/count()

sum/avg/count() over(partition by ..)

示例

select 
	id, 
	name, 
	age, 
	salary, 
	team, 
	sum(salary) over(partition by team) as sum_sal,			--统计某组中的总计值
	avg(salary) over(partition by team) as avg_sal,			--统计某组中的平均值
	count(salary) over(partition by team) as count_sal	--按某列分组,并统计该组中记录数量
from rownumber;

![[Pasted image 20241202143638.png]]

rows/range

rows/range  between … preceding and … following

上下范围内求值说明:

  • unbounded:不受控制的,无限的
  • preceding:在…之前
  • following:在…之后

示例

select 
	id, 
	name, 
	age, 
	salary, 
	team, 
	max(salary) over(partition by team order by salary rows 
	--unbounded preceding and unbounded following针对当前所有记录的前一条、后一条记录,也就是表中的所有记录 
	--unbounded:不受控制的,无限的 
	--preceding:在...之前 
	--following:在...之后
	between unbounded preceding and unbounded following) as max_sal
from rownumber;

![[Pasted image 20241202144318.png]]

nulls first/last

将空值字段记录放到最前或最后显示
说明:通过 rank()、dense_rank()、row_number() 对记录进行全排列、分组排列取值,但有时候,会遇到空值的情况,空值会影响得到的结果的正确性
nulls first/last 可以帮助我们在处理含有空值的排序排列中,将空值字段记录放到最前最后显示,帮助我们得到期望的结果

示例

select 
	id, 
	name, 
	age, 
	salary, 
	team, 
	rank() over(partition by team order by salary desc nulls last) as "rank" 
from rownumber

ntile(n)

有时会有这样的需求:如果数据排序后分为三部分,业务人员只关心其中的一部分,如何将这中间的三分之一数据拿出来呢?
这时比较好的选择,就是使用 ntile 函数

示例

select 
	id, 
	name, 
	age, 
	salary, 
	team, 
	max(salary) over(partition by team order by salary rows between unbounded preceding and unbounded following) as max_sal
	ntile(3) over(order by salary desc nulls last) all_cmp, --若只取前三分之一,all_cmp=1即可,若只取中间三分之一,all_cmp=2即可
  ntile(3) over(partition by team order by salary desc nulls last) all_team  --每个team的分成三部分
from rownumber;

keep(dense_rank first/last)

keep字面意思就是保持,也就是说保存满足 keep()括号内条件的记录,这里可以想象到,会有多条记录的情况,即存在多个 last 或 first 的情况

  • dense_rank 是排序策略
  • first/last 是筛选策略

示例

select 
	id, 
	name, 
	age, 
	salary, 
	team, 
	min(salary) keep(dense_rank first order by salary) min_sal
from rownumber;

标签:分析,salary,函数,over,partition,rank,rownumber,team
From: https://www.cnblogs.com/TMesh/p/18682841

相关文章

  • 某Websocket反爬逆向分析+请求加解密+还原html
    网址aHR0cHM6Ly93d3cueWR4Zi5nb3YuY24vTmV3cy9zaG93TGlzdC80L3BhZ2VfMS5odG1s前言工作中遇到的某websocket反爬,比混淆网站还恶心,看到也有其他人在问这个之前看到其他大佬也弄过这个websocket反爬,但是只是说了下加解密,个人觉得最重要的还是还原最终的html,所以来分享一下过程......
  • 某Websocket反爬逆向分析+请求加解密+还原html
    网址aHR0cHM6Ly93d3cueWR4Zi5nb3YuY24vTmV3cy9zaG93TGlzdC80L3BhZ2VfMS5odG1s前言工作中遇到的某websocket反爬,比混淆网站还恶心,看到也有其他人在问这个之前看到其他大佬也弄过这个websocket反爬,但是只是说了下加解密,个人觉得最重要的还是还原最终的html,所以来分享一下过程......
  • vue3 setup函数 有哪些参数,props、{attrs,slots,emit}等
    在Vue3中,setup函数是CompositionAPI的入口点,用于替代传统的data、methods、computed等选项。setup函数可以接收两个参数:props和context。下面详细解释这两个参数及其用途。setup函数签名import{SetupContext}from'vue';exportdefault{props:{//......
  • xe-utils 函数库使用示例
    xe-utils是一个功能丰富的JavaScript工具库,提供了大量的实用函数来简化常见的编程任务。它特别适用于与vxe-table(一个基于Vue.js的表格组件库)结合使用,但也可以独立应用于任何JavaScript项目中。安装xe-utils你可以通过npm或yarn安装xe-utils:npminstallxe-utils......
  • 《如何用代码提升财务分析能力》第1章 Python基础知识
    第1章Python基础知识1.1初识Python1.1.1Python简介Python发展历史Python由GuidovanRossum于1989年圣诞节期间开始开发,1991年发布第一个版本。它的名字来源于Guido喜欢的英国喜剧团体MontyPython。Python的发展经历了几个重要阶段:Python1.0(1994年):引入lambda、......
  • typescript is用法,函数返回值类型限制收窄
    is关键字主要用于定义类型谓词,它确实主要出现在函数的返回类型声明中,用于实现类型保护。然而,它的使用场景并不仅限于简单的类型检查函数。下面是一些详细的说明和扩展用法:主要用途:类型保护函数如前所述,最常见的用途是定义类型保护函数,以帮助TypeScript更准确地推断变量的类型......
  • scanf( ) 函数的介绍
      在C语言中,当我们有了变量,我们需要给变量输入值就可以使用scanf()函数。scanf()函数是用于读取用户键盘输入的函数,其定义于头文件stdio.h内,使用此函数时需包含该头文件(即#include<stdio.h>)。  程序运用到scanf()语句时,会停下来等待用户从键盘输入。用户......
  • 机器视觉在医疗影像分析中的应用:助力放射科医生精准诊断
    在现代医疗领域,影像学检查如X光、CT扫描和MRI等是诊断疾病的重要手段。随着技术的不断发展,机器视觉算法在医疗影像分析中的应用日益广泛,为放射科医生提供了强大的辅助工具,极大地提高了诊断的准确性和效率。本文将探讨机器视觉在医疗影像分析中的具体应用及其对医疗诊断带来的变......
  • python的函数学习
    函数定义方式Python:defmy_function(param1,param2,keyword_param=None):returnparam1+param2+(keyword_paramifkeyword_paramisnotNoneelse0)Python使用def关键字来定义函数。参数类型不需要显式声明,Python是动态类型语言。C/C++:intmy_function(intp......
  • rust学习-函数的定义与使用
    rust学习-函数的定义与使用1.函数的基本定义2.函数的参数多个参数3.返回值提前返回4.函数调用5.函数的所有权和借用传递所有权借用6.函数作为参数和返回值函数作为参数函数作为返回值7.泛型函数8.函数注释(文档注释)1.函数的基本定义在Rust中,函数使用fn......