row_number() OVER(PARTITION BY)函数介绍

article/2025/10/3 23:55:38

OVER(PARTITION BY)函数介绍

开窗函数          
     Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是:对于每个组返回多行,而聚合函数对于每个组只返回一行。

      开窗函数指定了分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化,举例如下:
1:over后的写法:    
   over(order by salary) 按照salary排序进行累计,order by是个默认的开窗函数
   over(partition by deptno)按照部门分区

 

  over(partition by deptno order by salary)

 

2:开窗的窗口范围
over(order by salary range between 5 preceding and 5 following):窗口范围为当前行数据幅度减5加5后的范围内的。

举例:

 

--sum(s)over(order by s range between 2 preceding and 2 following) 表示加2或2的范围内的求和

  select name,class,s, sum(s)over(order by s range between 2 preceding and 2 following) mm from t2
adf                          45              45  --45加2减2即43到47,但是s在这个范围内只有45
asdf                        55              55
cfe                          74              74
3dd                          78              158 --78在76到80范围内有78,80,求和得158
fda                          80              158
gds                          92              92
ffd                          95              190
dss                          95              190
ddd                          99              198

gf         3        99        198

 

 

 

over(order by salary   rows  between 5 preceding and 5 following):窗口范围为当前行前后各移动5行。

举例:

 

--sum(s)over(order by s rows between 2 preceding and 2 following)表示在上下两行之间的范围内
select name,class,s, sum(s)over(order by s rows between 2 preceding and 2 following) mm from t2
adf                          45              174  (45+55+74=174)
asdf                        55              252    (45+55+74+78=252)
cfe                          74              332      (74+55+45+78+80=332)
3dd                          78              379      (78+74+55+80+92=379)
fda                          80              419
gds                          92              440
ffd                          95              461
dss                          95              480
ddd                          99              388
gf                            99              293

 

 

over(order by salary  range  between unbounded preceding and unbounded following)或者
over(order by salary  rows  between unbounded preceding and unbounded following):窗口不做限制

 

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

row_number()over()、rank()over()和dense_rank()over()函数的使用

下面以班级成绩表t2来说明其应用

t2表信息如下:
cfe                          74
dss                          95
ffd                          95
fda                          80
gds                          92
gf                            99
ddd                          99
adf                          45
asdf                        55
3dd                          78

select * from                                                                                                                                           
                                                                                                                                                         
      select name,class,s,rank()over(partition by class order by s desc) mm from t2
                                                                                                                                                         
      where mm=1;
得到的结果是:
dss                          95              1
ffd                          95              1
gds                          92              1
gf                            99              1
ddd                          99             

注意:
      1.在求第一名成绩的时候,不能用row_number(),因为如果同班有两个并列第一,row_number()只返回一个结果;
select * from                                                                                                                                           
                                                                                                                                                         
      select name,class,s,row_number()over(partition by class order by s desc) mm from t2
                                                                                                                                                         
      where mm=1;
            95              --95有两名但是只显示一个
            92              1
            99              1 --99有两名但也只显示一个

      2.rank()和dense_rank()可以将所有的都查找出来:
如上可以看到采用rank可以将并列第一名的都查找出来;
        rank()和dense_rank()区别:
        --rank()是跳跃排序,有两个第二名时接下来就是第四名;
select name,class,s,rank()over(partition by class order by s desc) mm from t2
dss                          95              1
ffd                          95              1
fda                          80              3 --直接就跳到了第三
gds                          92              1
cfe                          74              2
gf                            99              1
ddd                          99              1
3dd                          78              3
asdf                        55              4
adf                          45              5
        --dense_rank()l是连续排序,有两个第二名时仍然跟着第三名
select name,class,s,dense_rank()over(partition by class order by s desc) mm from t2
dss                          95              1
ffd                          95              1
fda                          80              2 --连续排序(仍为2)
gds                          92              1
cfe                          74              2
gf                            99              1
ddd                          99              1
3dd                          78              2
asdf                        55              3
adf                          45              4

--sum()over()的使用
select name,class,s, sum(s)over(partition by class order by s desc) mm from t2 --根据班级进行分数求和
dss                          95              190  --由于两个95都是第一名,所以累加时是两个第一名的相加
ffd                          95              190 
fda                          80              270  --第一名加上第二名的
gds                          92              92
cfe                          74              166
gf                            99              198
ddd                          99              198
3dd                          78              276
asdf                        55              331
adf                          45              376

first_value() over()和last_value() over()的使用  



--找出这三条电路每条电路的第一条记录类型和最后一条记录类型

SELECT opr_id,res_type,
       first_value(res_type) over(PARTITION BY opr_id ORDER BY res_type) low,
       last_value(res_type) over(PARTITION BY opr_id ORDER BY res_type rows BETWEEN unbounded preceding AND unbounded following) high
  FROM rm_circuit_route
WHERE opr_id IN ('000100190000000000021311','000100190000000000021355','000100190000000000021339')
 ORDER BY opr_id;

 

注:rows BETWEEN unbounded preceding AND unbounded following 的使用

--取last_value时不使用rows BETWEEN unbounded preceding AND unbounded following的结果

 

SELECT opr_id,res_type,
       first_value(res_type) over(PARTITION BY opr_id ORDER BY res_type) low,
       last_value(res_type) over(PARTITION BY opr_id ORDER BY res_type) high
  FROM rm_circuit_route
 WHERE opr_id IN ('000100190000000000021311','000100190000000000021355','000100190000000000021339')
 ORDER BY opr_id;

如下图可以看到,如果不使用

rows BETWEEN unbounded preceding AND unbounded following,取出的last_value由于与res_type进行进行排列,因此取出的电路的最后一行记录的类型就不是按照电路的范围提取了,而是以res_type为范围进行提取了。

 

 

 

 

 

在first_value和last_value中ignore nulls的使用
数据如下:

 

 

取出该电路的第一条记录,加上ignore nulls后,如果第一条是判断的那个字段是空的,则默认取下一条,结果如下所示:

 

 

--lag() over()函数用法(取出前n行数据)
lag(expresstion,<offset>,<default>)
with a as 
(select 1 id,'a' name from dual
  union
  select 2 id,'b' name from dual
  union
  select 3 id,'c' name from dual
  union
  select 4 id,'d' name from dual
  union
  select 5 id,'e' name from dual

select id,name, lag(id,1,'')over(order by name) from a;

--lead() over()函数用法(取出后N行数据)

lead(expresstion,<offset>,<default>)
with a as 
(select 1 id,'a' name from dual
 union
 select 2 id,'b' name from dual
 union
 select 3 id,'c' name from dual
 union
 select 4 id,'d' name from dual
 union
 select 5 id,'e' name from dual

select id,name,lead(id,1,'')over(order by name) from a;

--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; 

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() b from a --分母缺省就是整个占比
order by a; 

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() b from a
group by a order by a;--分组后的占比


http://chatgpt.dhexx.cn/article/qpeLmqQe.shtml

相关文章

巧用ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING

背景 数据如上&#xff0c;按id和ssny分组&#xff0c;求最大的开票时间&#xff0c;若为空&#xff0c;取非空的上一期组内最大开票时间 解 SELECT id, ssny, kpsj, max(kpsj) OVER(PARTITION BY id ORDER BY ssny desc ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) …

mybatis RowBounds 分页

在 mybatis 中&#xff0c;使用 RowBounds 进行分页&#xff0c;非常方便&#xff0c;不需要在 sql 语句中写 limit&#xff0c;即可完成分页功能。但是由于它是在 sql 查询出所有结果的基础上截取数据的&#xff0c;所以在数据量大的sql中并不适用&#xff0c;它更适合在返回数…

RowBounds分页

不再使用SQL实现分页 1.接口 //分页List<User> getUserByRowBounds(); 2.mapper.xml <!-- 分页--><select id"getUserByRowBounds" resultType"UserMap">select * from mybatis.user</select> 3.测试 Testpublic void getUserByRo…

row_number() OVER(PARTITION BY)

日萌社 人工智能AI&#xff1a;Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战&#xff08;不定时更新&#xff09; row_number()排序函数 统计每个部门薪资最高的员工信息&#xff08;同一个部门的员工按照薪资进行降序排序&#xff09;第一种写法&#xff1a;ro…

在VS中安装nuget离线包nupkg文件

1、打开或者新建任意一个项目 2、项目-管理NuGet程序包 3、设置 4、设置好以后如下图&#xff0c;点击确定 5、安装

Uipath打包流程为.nupkg文件

先断开oc 在publish流程&#xff0c;其中main是入口 点击publish 然后打开Uipath robot&#xff0c;可以看到流程已经同步上去了

如何将nupkg离线安装包安装到VS2017、9

不知道为什么&#xff0c;用vs自带的nuget程序管理器安装nuget包非常慢&#xff0c;而且很容易出错&#xff0c;最重要的是编译的时候能急死人&#xff0c;于是换网、自己架nuget服务器...一顿折腾。 不再废话&#xff0c;直接上干货&#xff1a; 1、在官网https://www.nuget…

VS如何安装.nupkg文件

nupkg是visual studio 的NuGet Package的一个包文件 安装nupkg包前&#xff0c;在visual studio的NuGet中会显示该包需要的.net framework runetime版本需要 还有版权归属等信息 具体看一下截图 大家可以去下载一个&#xff1a;Google Protocol buffers 3.5.1的nupkg来试试 下…

vs2010 添加nupkg文件

起因呢是这样的&#xff1a;以前一直用破解版的Teechartd&#xff0c;其实这个问题也不大&#xff0c;也挺好的&#xff0c;只是因为它是破解的嘛&#xff1b; 近期对知识产权这块也非常重视&#xff0c;所以在这个开发中就考虑到我们未来远大的梦想&#xff0c;我们是仪表行业…

c#使用nuget.exe CLI发布 nupkg 包

2019独角兽企业重金招聘Python工程师标准>>> 准备 工具&#xff1a;nuget.exe CLI&#xff08;本人使用版本&#xff1a; NuGet Version: 4.6.2.5055&#xff09;将下载的的nuget.exe路径添加到系统变量PATH中vs创建的类库项目 操作 让项目自动生成版本号&#xff0…

如何将nupkg文件安装到VS2017

本文为原创文章、源代码为原创代码&#xff0c;如转载/复制&#xff0c;请在网页/代码处明显位置标明原文名称、作者及网址&#xff0c;谢谢&#xff01; 开发工具&#xff1a;VS2017 系统&#xff1a;Win10 X64 一、首先在https://www.nuget.org/下载离线nupkg文件&#xff0c…

制作NUGET包制作nupkg包

下载制作NUGET包工具 NUGETPACKAGEEXPLORER 直接下载NuGet Package Explorer软件&#xff0c;网盘CSDN等上面有好多 然后运行里面的 根据你自己的lib版本选择相应的选项 选择你的lib文件 选择Edit进行基础信息编辑 填写基础信息&#xff0c;图标填写绝对磁盘地址即可&#xf…

Nuget包管理器将nupkg文件导入ASP.NET MVC5项目

备注&#xff1a;使用的是Visual Stual2013。 1、新建ASP.NET Web应用程序&#xff0c;自定义项目名、解决方案名 2、选择对应的模板&#xff0c;可以勾选添加单元测试 3、选择菜单栏&#xff1a;工具——Nuget包管理器——程序包管理器设置(N)&#xff0c; 出现界面如下&…

没有外网只有内网,nuget离线安装nupkg的方法

2018.11.24更新&#xff1a;终极解决方案&#xff0c;去内网搭一个私有库把 目录 1. 在有外网的电脑上先安装成功&#xff0c;然后拷到没有外网的电脑上。2. 创建Vue模板成功&#xff0c;但是运行dotnet restore找不到资源3. 按照指定路径找资源&#xff0c;而不是让它自动的去…

PowerShell Gallery .nupkg手动下载将.nupkg文件重命名为.zip,然后将内容提取到本地文件夹中

PowerShell Gallery支持直接从网站下载软件包&#xff0c;而无需使用PowerShellGet cmdlet。您可以将任何软件包下载为NuGet软件包&#xff08;.nupkg&#xff09;文件&#xff0c;然后将其复制到内部存储库中。 注意 手册包下载是不打算作为一个替代Install-Module小命令。下载…

C#安装本地nupkg包

联机库 搜索nuGet 下载安装 工具菜单中多了一个nuGet选项 扩展管理器中也可以看到 打开一个项目 什么都没有 添加一个 打开“工具”——“选项” 点击绿色的加号&#xff0c;源为自己下载的包所在的文件夹路径&#xff0c;名称自己起 点击确定 可以安装 很快就安装好了&#x…

如何在本地安装NuGet包.nupkg文件?

本文翻译自&#xff1a;How do I install a NuGet package .nupkg file locally? I have some .nupkg files from a C# book. 我有一些来自C&#xff03;书的.nupkg文件。 How can I install them? 我该如何安装它们&#xff1f; #1楼 参考&#xff1a;https://stackoom.co…

VS2019添加自定义发布本地的Nuget(.nupkg文件)

要打包生成.nupkg文件&#xff0c;可以有如下几种方法&#xff1a; 方法一&#xff1a; 一、打开外部工具 打开VS 【工具】 - 【外部工具】&#xff0c;点击添加按钮&#xff0c;输入如下内容 如下图所示&#xff1a; 标题&#xff1a;发布本地Nuget 或者随便自定义一个名…

VS2015用nuget包管理器离线安装nupkg包

最近在用C#开发ZMQ通信相关的东西&#xff0c;NetMQ是ZMQ(ZeroMQ)在C#的移植版本。。 而我在离线导入netmq的时候出现了各种各样的问题&#xff0c;这边记录一下过程&#xff0c;方便以后参考。 NetMQ.nupkg包及其依赖的包下载 在nupkg官网搜索下载&#xff0c;官网地址 右侧…

VS中安装.nupkg文件

代码修复从get-only属性生成的记录&#xff08;不可变类/结构&#xff09;构造函数。 这包括使用.NET编译器平台&#xff08;Roslyn&#xff09;创建的分析器的VSIX和NuGet包。 VSIX&#xff1a;https&#xff1a;//visualstudiogallery.msdn.microsoft.com/941ef3c4-a523-4d…