当前位置: 首页 > news >正文

sql窗口函数学习笔记

窗口函数介绍:

一. 应用场景:

  1. 分组排序分析
  2. 分组求和,分组累加求和,求平均等
  3. 求数据同比环比时数据偏移

二.窗口函数介绍:

函数() over (partition by <分组列> order by <排序列> rows between 开始行 and 结束行) 
  • 窗口函数是通过窗口函数名+窗口数据集组成。
  • 窗口函数是对where或者group by子句处理后的结果进行操作,所以窗口函数原则上只能写在select子句中。
  • 窗口函数分为三大类:排序类窗口,聚合类窗口,取值函数(极值,偏移,切片等)
  1. 排序函数():rank() ,dense_rank(),row_number()
  2. 聚合函数():avg(),percent_rank(),cume_dist(),sum()
  3. 取值函数():first_value(),last_value(),nth_value(),lag(),lead(),ntile()

在这里插入图片描述

窗口函数应用:

一. 排序函数

  1. 基础数据:
    在这里插入图片描述
  2. 使用分组函数按照班级分组,分数排序进行查询
select name AS "姓名" ,class as "班级",score as "分数"
 ,RANK() over(partition by class order by score desc) rank_id -- rank()可并列不可连续 1,1,3,4
 ,DENSE_RANK() over(partition by class order by score desc) dense_rank_id-- DENSE_RANK()可并列连续 1,1,2,3
 ,ROW_NUMBER() over(partition by class order by score DESC) row_number_id-- ROW_NUMBER()不可并列但连续 1,2,3,4
 from mark
  • rank()可并列不可连续 1,1,3,4
  • DENSE_RANK()可并列连续 1,1,2,3
  • ROW_NUMBER()不可并列但连续 1,2,3,4

结果:

在这里插入图片描述

二.聚合函数

  1. 基本聚合函数使用
select name AS "姓名" ,class as "班级",score as "分数"
,max(score) over(partition by class) as "最高得分"
,min(score) over(partition by class) as "最低得分"
,avg(score) over (partition by class ) as "平均分"
,sum(score) over(partition by class) as "总分"
,count(score) over (partition by class) as "score计数"
,count(1) over(partition by class) as "计数"
 from mark
  • max():最大值
  • min():最小值
  • sum():求和
  • avg():求平均值
  • count():计数
    在这里插入图片描述
  1. 复杂聚合函数使用
 select name AS "姓名" ,class as "班级",score as "分数"
,ROW_NUMBER() over(order by score desc) as "行数"
,CUME_DIST() over(order by score desc) as "cume_dist"
,concat(cast(100*CUME_DIST() over(order by score desc) as DECIMAL(10,1)),'%') as "cume_dist_%"
,RANK() over(order by score desc) rank_id -- rank()可并列不可连续 1,1,3,4
,PERCENT_RANK() over(order by score desc) as "percent_rank"
,concat(cast(100*PERCENT_RANK() over(order by score desc) as DECIMAL(10,1)),'%') as "percent_rank_%"
 from mark
  • cume_dist:大于等于当前行值得行数/分组内总行数,用于计算累计分布值 ,0<=x<=1
  • percent_rank:窗口内当前行得RANK值-1/窗口内总行数-1(这里得rank值,就是rank()函数得返回值),用于计算当前行在整个分区内的排名百分位数,0<=x<=1

在这里插入图片描述

三.取值函数

相关文章:

  • 记:谷歌开发者大会2022——共码未来
  • vue3 + vite 性能优化 ( 从5s -> 0.5s )
  • SpringBoot 静态资源(static)无法访问问题404
  • 混合策略改进的麻雀搜索算法-附代码
  • SNARK性能及安全——Prover篇
  • Docker的安装与操作
  • Zabbix监控入门到跑路
  • 无人机中的坐标系与相机姿态计算
  • 100天精通Python(数据分析篇)——第56天:Pandas读写txt和csv文件(read_csv、to_csv)
  • 【开发小记】vue项目优化
  • 1、javaweb学习知识简析
  • 【Linux操作系统】基础概念和常用指令(一)
  • 类和对象·默认成员函数
  • Elastic Stack(elk+filebeat)
  • PyTorchの可视化工具
  • ES6 学习笔记(一)let,const和解构赋值
  • JavaScript设计模式系列一:工厂模式
  • Nacos系列:Nacos的Java SDK使用
  • nginx 负载服务器优化
  • socket.io+express实现聊天室的思考(三)
  • VuePress 静态网站生成
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 给第三方使用接口的 URL 签名实现
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 在Docker Swarm上部署Apache Storm:第1部分
  • ​你们这样子,耽误我的工作进度怎么办?
  • !$boo在php中什么意思,php前戏
  • #pragma预处理命令
  • #QT(智能家居界面-界面切换)
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (C++)八皇后问题
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (HAL库版)freeRTOS移植STMF103
  • (Oracle)SQL优化基础(三):看懂执行计划顺序
  • (rabbitmq的高级特性)消息可靠性
  • (笔试题)合法字符串
  • (补充)IDEA项目结构
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (论文阅读40-45)图像描述1
  • (三)docker:Dockerfile构建容器运行jar包
  • (小白学Java)Java简介和基本配置
  • (一)十分简易快速 自己训练样本 opencv级联haar分类器 车牌识别
  • (原创)可支持最大高度的NestedScrollView
  • ****Linux下Mysql的安装和配置
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .form文件_一篇文章学会文件上传
  • .gitattributes 文件
  • .NET Core MongoDB数据仓储和工作单元模式封装