前言

很早之前就想写一篇关于窗口函数的文章,因精力有限所以一直搁置了(一脸认真的自我检讨),在这篇文章的准备阶段,我也拜读了一些相关文章,总体来说基本上所涉及的窗口函数相关知识均有涉及,但一万个读者有一万个哈姆雷特,每个人的文章角度不同,本文主要是面向基础,希望能够用通俗易懂的话语同时结合实际高频面试题为大家打开一扇“窗”。

正文

一、窗口函数简介

窗口函数也称为OLAP函数。OLAP是online analytical processing的简称,意思是对数据库数据进行实时分析处理。——百度百科

窗口函数的基本语法如下:

<窗口函数> over (partition by <用于分组的列名> order by <用于排序的列名>)

窗口函数是针对定义的行集合执行聚集分析,不减少原表的行数同时具备分组与排序的功能;通俗一点讲,窗口函数会按照指定的列名分组,在组内进行排序,同时保持原表行数不发生变化;这与group by 分组聚合后每组返回一个值(原表行数改变)有明显的区别。

窗口函数关键字:

over() : over子句中的内容为窗口函数的作用域(范围)

partition by :分组

order by : 排序

二、常用窗口函数介绍

1、排序函数

  • rank() 如果有并列名次的行,会占用下一名次的位置
  • dense_rank() 如果有并列名次的行,不会占用下一名次的位置
  • row_number() 不考虑并列名次的情况
select *, rank() over (order by 金额 asc) as ranking,
dense_rank() over (order by 金额 asc) as dens_rank,
row_number() over (order by 金额 asc) as row_num from table

排序函数区别示意表

常用场景:

排序函数常用于组内排序问题,如:topN问题 (找出每个部门排名前N的员工)

2、偏移函数

--基本语法lag(exp_str,offset,defval) over()Lead(exp_str,offset,defval) over()--exp_str要取的列--offset取偏移后的第几行数据--defval:没有符合条件的默认值

  • lag() lag是用于统计窗口内往上(向前偏移)第n行值
  • lead() lead是用于统计窗口内往下(向后偏移)第n行值
select *,lag(要偏移的列) over(partition by department order by 要排序的列) as next_lag
from table
---------------------------------------------------------------------------------------
select *,lead(要偏移的列) over(partition by department order by 要排序的列) as next_lead
from table

偏移函数lag示意图
偏移函数lead示意图

常用场景:

多用于解决用户连续登录问题,如连续7天都登陆的用户数

拓展:

偏移函数还有first_value()、last_value(),感兴趣的同学可以自行学习,本文不作介绍。

3、聚合函数

  • sum()
  • avg()
  • count()
  • max()
  • min()
select * ,sum(需要计算的列名) over (order by 需要计算的列名) as sum,
avg(需要计算的列名) over (order by 需要计算的列名) as avg,
count(需要计算的列名) over (order by 需要计算的列名) as cot,
max(需要计算的列名) over (order by 需要计算的列名) as max,
min(需要计算的列名) over (order by 需要计算的列名) as min
from table

聚合函数在窗口函数中是针对自身记录、以及自身记录之上的所有数据进行计算。

聚合函数作为窗口函数,可以直观的看到,截止到本行数据,统计数据是多少(最大值、最小值等);同时可以看出每一行数据,对整体统计数据的影响。

三、代码实操(经典问题)

本文代码只展示基本框架,如遇同类问题,直接代入使用即可

1、排序

topN问题 (找出每个部门排名前N的员工)

select *
from (select *, row_number() over (partition by 要分组的列名order by 要排序的列名 desc) as rankingfrom 表名) as a
where ranking <= N

2、偏移

user_name 用户名(连续7天都登陆的用户数)

思路:

  1. 首先利用偏移窗口函数lead()求得每个用户在每个登陆时间向后偏移7行的登陆时间;(需要注意:date 按倒序排序)
  2. 再计算每个用户在每个登陆时间滞后7天的登陆时间;
  3. 如果每个用户向后偏移7行的登陆时间等于滞后7天的时间,说明该用户连续登陆了7天
select b.user_name
from
(select user_name,
date,lead(date,7,-1)
over(partition by user_name order by date desc) as date_7
from user_login_table) b
where
date_sub(cast(b.date as date,7)) = cast(b.date_7 as date)

四、总结

本文主要介绍了窗口函数的基本概念以及几种高频窗口函数的用法,在实际工作中窗口函数是经常用到的,可能乍一看不是很好理解,这是正常现象,多练习肯定没问题。

以上,如果觉得有点用,请记得点赞关注,谢谢!

plsql打开sql窗口快捷键_SQL干货|为你打开一扇窗—窗口函数相关推荐

  1. plsql打开sql窗口快捷键_巧用Navicat for MySQL的快捷键

    php中文网最新课程 每日17点准时技术干货分享 巧妙地使用 Navicat for MySQL 快捷键,可以大大提高工作效率,本篇经验将分类介绍Navicat for MySQL快捷键. ctrl+ ...

  2. plsql打开sql窗口快捷键_可以提升3倍开发效率的 Intellij IDEA快捷键大全汇总(2019)...

    整理了一下IDEA的常用快捷键,可以打印出来或者弄成图片设置为桌面,为广大的程序员们节省更多的时间去谈恋爱. 常用快捷键1 Ctrl+Shift + Enter,语句完成 "!", ...

  3. plsql打开sql窗口快捷键_plsql 快捷键配置

    plsql 快捷键配置 CreateTime--2018年4月23日17:41:45 Author:Marydon 功能快捷键 预设条目 中文解释 快捷键配置 Edit/Undo 撤销 ctrl+z ...

  4. win10运行在哪里打开 win10怎么打开运行窗口快捷键

    win10系统的运行命令框在哪里?win10打开运行对话框的快捷键是什么?运行窗口是使用windows系统比较常用的工具,运行框可以通过命令快速调用windows组件.有用户第一次使用win10系统, ...

  5. win10如何打开计算机窗口,Win10如何打开运行窗口_Win10打开运行窗口快捷键-192路由网...

    问:Win10如何打开运行窗口?我的电脑使用的是Win10系统,现在我想打开运行程序窗口:但是忘记了打开方法,在Win10系统中,找了半天也没找到打开办. 请问在Win10电脑上,如何才能打开运行程序 ...

  6. 上帝给你关闭一道门,就会为你打开一扇窗,反推。

    大家都只是道这句话就是善意的谎言,就是一个安慰的话. 怎么证明呢 反推 上帝给你打开一道门,就会为你关闭一扇窗.还有一句自古红颜多薄命,很相似.但是,这些都是小人或者是,普通人想掩盖自己的嫉妒而痛下杀 ...

  7. plsql导入到mysql数据库乱码问题_PLSQL打开sql文件中文乱码解决方案

    1. 查看数据库当前字符集参数设置 SELECT * FROM v$nls_parameters; 2. 查看数据库可用字符集参数设置 SELECT * FROM v$nls_valid_values ...

  8. php打开页面的快捷键,窗口切换快捷键是什么

    窗口切换快捷键是[ATL+TABLE].具体使用方法:首先按住ALT键,不要松开:然后按下TAB键,此时会切换到当前窗口的下一个窗口.如果不松开ALT键,每次按下TAB键都会按顺序切换到下一个窗口. ...

  9. chrome打开清除浏览数据窗口快捷键

    Ctrl+Shift+Del 打开清除浏览数据窗口 热键组合 实现的功能 F1 Google浏览器帮助中心 F12 打开Chrome控制台 Ctrl+J 进入"下载内容"页面 Ct ...

最新文章

  1. 《LeetCode力扣练习》第64题 最小路径和 Java
  2. 安卓高手之路之 应用篇
  3. 在哪里刷题_刷题过程中,这些坑你踩了几个?
  4. 【杂谈】GAN对人脸图像算法产生了哪些影响?
  5. Swagger UI 与SpringMVC的整合 II
  6. js 正则 显示千分号 支持整数和小数
  7. php怎样完成批量审核,CMS_DedeCMS 批量取消审核文档的实现方法,今天修改了几个地方的代码 实 - phpStudy...
  8. 利用一维数组求菲波那契数列前40项的和并输出结果。_[W2D2]斐波那契数列
  9. dos 初始化 mysql数据库_DOS下的MySQL数据库基本操作
  10. 简单理解编程语言的工作原理
  11. 如何在Windows上制作一个包含.lib和.dll的Rust Crate包
  12. 代码一键自动生成,拿走不谢
  13. PDA开发从入门到精通
  14. C# “配置系统未能初始化” 异常解决
  15. 锐捷无线AC基础命令
  16. 人工智能主要应用的七大领域
  17. 区块链报告会心得体会3000_区块链讲座观后感6
  18. 兰燕-杨平平的需求建议
  19. 硬件混合渲染器 (HWC)
  20. Sony vegas 制作电子相册

热门文章

  1. java jfm入门_java图形编程
  2. matlab 二维高斯滤波 傅里叶_机器视觉 03.2 频域低通滤波
  3. 500万用户 表_500万用户的社交电商平台社群分层运营模型「第219期触电夜话」...
  4. 作者:庄会富(1985-),男,中国科学院昆明植物研究所科技信息中心主管
  5. 作者:高翔(1984-),男,国防大学信息作战与指挥训练教研部博士后,主要研究方向为体系分析与超网建模。...
  6. 【计算机组成原理】CPU
  7. 用面向对象解决问题(洛谷P1093题题解,Java语言描述)
  8. 怎样成为一个好的技术领导者
  9. 进程间通信之2----共享内存
  10. Windows Azure Web Site (15) 取消Azure Web Site默认的IIS ARR