栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

窗口函数、开窗函数ROW

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

窗口函数、开窗函数ROW

数据库sql中的开窗/窗口函数
  • 1.介绍
  • 2.应用场景与例子
  • 3.补充

1.介绍

       首先,不论是SQL Server、Oracle还是MySQL都有窗口函数。今天在工作中遇到了,而且好久没有水博客了~
       开窗函数语法:窗口函数 over(partition by 列名1 order by 列名2 ),窗口函数可以是ROW_NUMBER(),也可以是其他,会一个其他都是大同小异,本节就以它举例,它的作用就是可以给每一条记录生成一个唯一的行号。配合partition by 列名1就可以在“列名1”此列,值相同的记录中给每一条记录从1依次递增生成唯一的逻辑行号,加上order by就可以实现自定义排序。

2.应用场景与例子
  • 应用场景:
           简单说就是,有一个成绩表,里面的每一行记录着每个人的姓名、科目、成绩。所有人的各科成绩都混杂在一起,你现在要做的是按成绩高低取出,每一科成绩最高的记录。
           应用场景大概就是这个意思,我们可以猜到使用ROW_NUMBER() OVER(PARTITION BY 科目 ORDER BY 成绩 DESC)即可。下面换一个实际点的例子。
  • 例子
           有一个审核表,一个列叫freportid,表示一个东西。还有一个列名叫fresult,表示对该东西进行的操作。也就是说,这是一个审核上报卡的表,每次审核都会将某个上报卡的审核结果(3种结果)插入表中,那么一个上报卡(freportid)就会有多条数据。具体含义请看备注:

       现在我要的是,获取每一张报告卡最新的审核状态,由上图可知,我们要做如下的事:
1.对freportid进行“分组”
2.对同一freportid的多条记录,按fkey进行排序
3.将分组排序后的结果集进行筛选,选择每个freportid中fkey最大的一个

  • 操作:
select freportid,fresult,fkey,fopdt,ROW_NUMBER() OVER(PARTITION BY freportid ORDER BY fkey DESC) R 
from ib_tbs_reportexam


       可以看到上面已经实现在每个相同的freportid上进行排序了,我们只需要将每个小组或者叫窗口,这里取出fkey最大的记录即可,由于ROW_NUMBER()给每个窗口的每一条记录按顺序编了号,所以我们只需将R=1的记录取出来即可,R是上面取的别名,代表行号。代码和结果如下:
再补充一下,直接where R=1是不可以的,因为R是别名,需要使用虚表才能进行筛选:

with a as(
select freportid,fresult,fkey,fopdt,ROW_NUMBER() OVER(PARTITION BY freportid ORDER BY fkey DESC) R 
from ib_tbs_reportexam
)
select * from a where R=1

3.补充
  • 开窗函数只是相对于聚合函数而言的,聚合函数是将group by后的分组聚合成单条数据,而开窗函数后的over(英文:在……之上,在……控制下)就可以理解为在分组列名相同的结果集上进行操作——就像打开窗户拿里面的东西一样
  • 窗口函数不能单独使用
  • 聚合函数也可以使用OVER开窗操作
  • 不用纠结窗口函数还是开窗函数,我更喜欢将ROW_NUMBER() OVER()这样理解:
    • ROW_NUMBER——窗口函数
    • ROW_NUMBER() OVER()——开窗函数,因为有“OVER”~
  • 还不懂的话可以看看(相信不用看了吧~):
    https://blog.csdn.net/fygkchina/article/details/80521550
    https://blog.csdn.net/u013986335/article/details/124461723
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1013116.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号