SQL窗口函数的使用

2023-11-04

· 定义:窗口函数,又叫OLAP(Online Anallytical Processing)函数,可对数据库数据进行实时分析处理。

· 功能:同时分组和排序;不减少原表的行数(区别于聚合函数,每行数据都生成一个结果)

· 使用场景:排名问题,topN问题

· 基本语法:

<窗口函数> OVER (PARTITION BY <用于分组的列名> ORDER BY <用于排序的列名>);
-- over关键字用于指定函数的窗口范围,
-- partition by 用于对表分组,
-- order by子句用于对分组后的结果进行排序。

· 窗口函数的位置可以放置以下两种函数:

1>专用窗口函数,包括rownumber();rank();denserank()等(后文以这3个为例介绍)。

2 >聚合函数,如sum,avg,count,max,min等。

· 几种窗口函数的用法:

这部分引用学生成绩排名的班级表举例。
在这里插入图片描述
①rank()
将每个班按成绩排名

SELECT *,rank() 
OVER 
(PARTITION BY 班级 ORDER BY 成绩 DESC) 
AS ranking 
FROM 班级表;

在这里插入图片描述
②dense_rank(),row_number()的用法及与rank()的区别

使用与①中类似的句式,看一下三者之间的区别:

SELECT *,rank() OVER (ORDER BY 成绩 DESC) AS ranking,
         dense_rank() OVER (ORDER BY 成绩 DESC) AS dense_rank,
         row_number() OVER (ORDER BY 成绩 DESC) AS row_number FROM 班级表;

在这里插入图片描述
rank() 如果有并列名次的行,占用下一名次的位置;

dense_rank() 如果有并列名次的行,顺次排列,不占用下一名次的位置;

row_number() 顺次排序,不考虑并列名次问题。

③聚合窗口函数

可以明确、直观地看到截止到某行数据,统计数据是多少,同时可以看出每行数据对整体统计数据的影响。用法与专用窗口函数相同,但括号中需要指定聚合的列名。

SELECT *,sum(成绩) OVER (ORDER BY 学号) AS current_sum,
avg(成绩) OVER (ORDER BY 学号) AS current_avg,
count(成绩) OVER (ORDER BY 学号) AS current_count,
max(成绩) OVER (ORDER BY 学号) AS current_max,
min(成绩) OVER (ORDER BY 学号) AS current_min FROM 班级表;

在这里插入图片描述
另外,还有三种常用方式(以平均数为例):

①计算当前行与前n行(共n+1行)的聚合窗口函数

SELECT *,avg(成绩) 
OVER 
(ORDER BY 学号 ROWS n PRECEDING) 
AS current_avg 
FROM 班级表; 

②计算当前行与之后n行的聚合窗口函数

SELECT *,avg(成绩) 
OVER 
(ORDER BY 学号 ROWS n FOLLOWING) 
AS current_avg 
FROM 班级表;

③计算当前行与前n1行、后n2行的聚合窗口函数

SELECT *,avg(成绩) 
OVER 
(ORDER BY 学号 ROWS BETWEEN n1 PRECEDING AND n2 FOLLOWING) 
AS current_avg 
FROM 班级表; 

多用于公司业绩名单排名中,可以通过移动平均直观地看到与相邻名次业绩的平均、求和等统计数据。

注意事项:

①partition子句可以省略,省略时默认不指定分组(开窗列),但会因此失去窗口函数的功能,所有一般不这样使用;

②因为窗口函数是对where和group by子句处理后的结果进行操作,所以原则上只能写在select子句中;

③窗口函数中不能嵌套使用窗口函数和聚合函数;

④专用窗口函数()为空,聚合窗口函数()中会写对应聚合列。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL窗口函数的使用 的相关文章

  • SQL Server 将 varbinary 转换为字符串

    我想在 T SQL 中进行转换varbinary类型转字符串类型 这是一个例子 首先我得到了这个varbinary 0x21232F297A57A5A743894A0E4A801FC3 然后我想将其转换为 21232f297a57a5a74
  • 使用 SimpleMembershipProvider 更新自定义用户配置文件字段?

    我添加了一个自定义字段UserProfile表名为ClassOfYear我可以在注册过程中将数据获取到个人资料中 如下所示 var confirmationToken WebSecurity CreateUserAndAccount mod
  • SQL Server:我可以使用 EXEC 来运行外部应用程序吗?

    您好 感谢您抽出时间 我一直在网上到处搜索一个示例 其中 SQL 触发器将运行外部应用程序 但我没有运气 我所看到的是 EXEC 将执行 SQL 过程 我需要这个的原因是 我有一个包含许多表的 SQL Server 2010 当某些表上发生
  • SqlDataSource和存储过程调用问题

    我偶然发现了一个问题 但无法自己解决 希望有人能帮我解决 所以 我在 SQL Server 2005 数据库中有一个简单的存储过程 CREATE PROCEDURE spTest pin varchar 128 AS BEGIN SELEC
  • 帮助子查询!返回多于 1 行

    我不明白返回多行的问题 这是我的桌子 BBC name region area population gdp Afghanistan South Asia 652225 26000000 Albania Europe 28728 32000
  • 在 wp_query 中结合关键字搜索和税务查询

    我一直在尝试创建自定义搜索查询 并且已经取得了一些进展 但遇到了另一个障碍 我试图将 wp query 中的meta query 关键字搜索 s 和tax query 与 OR 关系结合起来 感谢这篇精彩的文章 我已经让 meta quer
  • NHibernate 对单个属性的更新会更新 sql 中的所有属性

    我正在 NHibernate 中对单个属性执行标准更新 然而 在提交事务时 sql 更新似乎设置了我映射到表上的所有字段 即使它们没有更改 这肯定不是 Nhibernate 中的正常行为吧 难道我做错了什么 谢谢 using var ses
  • Flutter mysql1 数据包乱序

    我在建立 VPS 与图书馆的连接时遇到一些问题mysql1上颤动 我收到这个错误Unhandled Exception Error 1156 08S01 Got packets out of order当我执行查询时 MySQL服务器版本
  • 表与视图的性能

    最近开始使用一个数据库 其中的惯例是为每个表创建一个视图 如果您假设表和视图之间存在一对一的映射 我想知道是否有人可以告诉我这样做对性能的影响 顺便说一句 这是在 Oracle 上的 假设问题是关于非物化视图 实际上取决于视图所基于的查询以
  • 空字符串与NULL

    我有一个表 其中一些行有一些空白cells 我尝试使用 IS NULL 函数选择此类行 但查询选择了 0 行 select from zzz fkp registration female where fname is null 0 row
  • 该模型已具有同名的元素 - ASP.NET

    我正在使用 ASP Net Web 应用程序 每当我尝试添加FOREIGN KEY此错误出现在数据工具操作中 SQL71508 该模型已具有同名的元素 dbo FK Sellers Users SQL71508 该模型已经有一个元素 具有相
  • Postgres 创建一个带有外键数组的表

    我正在制作一个名为 routes 的表 我希望它能够包含航班列表 航班详情请参阅航班表 我希望 航班 是航班表中的外键 ID 数组 所以 我有这个代码 CREATE TABLE routes id SERIAL PRIMARY KEY fl
  • 如何从 Oracle 中获取格式化的 XML

    我对 Oracle 缺乏经验 并且在将数据导出为 XML 时遇到问题 我已经设法让这个查询正常工作 但 XML 的格式似乎是固定的 对我来说不起作用 这是查询 SELECT value em getClobVal AS output FRO
  • 如何在一个查询中最大(日期)并使用sql server中的in功能?

    我有一张这样的桌子 id color shade date 1 red dark 01 01 1990 2 red light 09 16 2013 3 green light 08 15 2010 4 green dark 09 18 2
  • SQL Server:使用计算列批量插入表

    我尝试使用 bcp 将文本文件中的数据插入到具有计算列的 SQL Server 2016 表中 我的 bcp 命令 bcp Test dbo myFirstImport IN D myFirstImport txt f D myFirstI
  • 将 SQL 保留在存储过程中与代码中的优点和缺点是什么

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动
  • 相当于 pandas 'transform' 的 SQL 是什么?

    假设您有以下 SQL 表 A B C 2 1 4 3 4 5 3 1 1 1 4 0 5 0 1 并且您想要添加 显示一个列 其中包含 A 列对于 B 列的每个不同值的平均值 或任何其他聚合函数 您想要保留所有列 所以结果会是这样的 A B
  • MySQL 中的排名函数

    我需要找出客户的等级 这里我根据我的要求添加相应的 ANSI 标准 SQL 查询 请帮我将其转换为 MySQL SELECT RANK OVER PARTITION BY Gender ORDER BY Age AS Partition b
  • 数据库设计 - 何时拆分表?

    有时创建一个单独的表会产生更多工作 我是否应该将其拆分 例如 在我的项目中 我有一张客户表 每个客户对每种产品都有自己的特殊价格 只有5种产品 未来不会计划更多产品 每个客户也有一周中公司向他交付产品的独特日子 当日期和产品价格是客户表中的
  • 检查SQL Server数据库表中是否存在表或列

    在 SQL Server 数据库中创建列或表之前 我想检查所需的表和 或列是否存在 我已经四处搜寻 到目前为止发现了两种方法 我不想使用存储过程 通过使用SqlCommand ExecuteScalar 方法并捕获异常来确定表 列是否存在

随机推荐

  • Ubuntu安装JDK1.8(手动解压JDK压缩包)

    1 官网下载JDK https www oracle com technetwork java javase downloads jdk8 downloads 2133151 html 2 解压缩 下载的版本jdk 8u211 linux
  • ubuntu18.04安装wireshark3.x与tshark3.x

    默认安装tshark会是2 x 以下是安装3 x的方法 使用命令 sudo add apt repository ppa wireshark dev stable sudo apt update 安装wireshark3 x sudo ap
  • IPv6 PMTUD 路径发现机制 工作原理

    Technorati 标签 IPv6 PMTUD PMTUD IPv6 PMTUD是IPv6的一个工作机制 其主要的目的就是 当网络源发送数据报文到目的的时候 避免分段 也可以称为分片 源节点可以使用发现整个路径上面最大的MTU与目的节点通
  • Android opengles2.0 背景透明

    在Android上开发OpenGL ES应用时 默认的背景不透明的 即使使用了glClearColor来设置了不透明度为0 且纹理图片中有透明的部分也可能被GLView的背景填充 那么首先解决GLView的透明背景问题吧 要设置透明的第一步
  • python-gitlab

    一 安装 pip install python gitlab 官方文档 http python gitlab readthedocs io en stable API https docs gitlab com ce api project
  • springboot项目层次结构_SpringBoot 项目目录结构(工程结构)

    一 代码层结构 根目录 com jianbao 启动类JianbaoApplication java推荐放在根目录 com jianbao 包下 数据实体类domain jpa项目 com jianbao domain mybatis项目
  • 江西理工大学计算机网络基础试卷,无线网络技术作业(江西理工大学期末复习)...

    无线网络技术 1 1 跳频扩频和直接序列扩频各有什么特点 我的答案 跳频扩频 1 一定扩频码序列进行选择的多频率频移键控调制 载波频率不断跳变 2 发送方看似随机的无线电频率序列广播消息 并以固定间隔从一频率跳到另一频率 3 接收方接收时也
  • java对象和类的定义 属性 方法

    类 class 对象 Object instance 实例 1 类可以看成一类对象的模板 对象可以看成该类的一个具体实例 2 类是用于描述同一类型的对象的一个抽象概念 类中定义了这一类对象所应具有的共同属性 方法 类的定义方式 每一个源文件
  • JSP数据交互(一)---内置对象》response

    JSP内置对象之response response对象用于响应客户请求并向客户端输出信息 设置响应参数等 页面重定向 void sendRedirect String location 客户端将重新发送请求到指定的URL 实现登陆验证 并验
  • vector、list、queue

    引用 windows程序员面试指南 vector vector 类似于C语言中的数组 vector 支持随机访问 访问某个元素的时间复杂度 O 1 vector 插入和删除元素效率较低 时间复杂度O n vector 是连续存储 没有内存碎
  • 重构——写在后面

    重构方法有很多 但是只要满足以下条件 怎么重构都是合理的 原则一 SRP Single responsibility principle 单一职责原则又称单一功能原则 核心 解耦和增强内聚性 高内聚 低耦合 描述 类被修改的几率很大 因此应
  • MyBatis实现Mysql数据库分库分表操作和总结(推荐)

    阅读目录 前言 MyBatis实现分表最简单步骤 分离的方式 分离的策略 分离的问题 分离的原则 实现分离的方式 总结 前言 作为一个数据库 作为数据库中的一张表 随着用户的增多随着时间的推移 总有一天 数据量会大到一个难以处理的地步 这时
  • 对于git功能的探索与研究

    读前提示 注意 本文只是面向初学者或者之前并未接触过git而想学习如何初步使用git的读者 如果您很擅长使用git 并善于维护远程仓库 那么不建议您看此篇文章 这会浪费您的时间 当然 这篇文章还是能很好地告诉初学者如何简单的运用git的 比
  • 【C++】类的隐式转换和explicit抑制类的隐式转换

    2023年8月5日 周六下午 今天在网上找了很久都没找到有精确定义了类的隐式转换条件的资料 最后是在权威书籍 C Primer 第5版 里面找到的 说真的 虽然我认为 C Primer 第5版 不适合作为新手学习C 的教材 因为内容太多了
  • [[概率论与数理统计-2]:随机函数、概率、概率函数、概率分布函数

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 123608954 目录 第1章 随机与
  • ZonedDateTime 转为字符串

    Java8新特性ZonedDateTime 这个类有很多好用的方法 但是也有很多坑 它转为字符串时间不对 一般会少几个小时 这个因为地区时间不对 我们只需要转为字符串的时间添加几小时就好 代码如下 public static String
  • c++ vector内存释放踩坑,内存泄漏

    目录 vector删除元素 智能指针 vector移动元素位置 vector条件删除
  • 编译原理之first集,follow集,select集解析

    为了方便自顶向下语法分析 需要求文法对应的first集 follow集 以及select集 本文主要分为两部分 一个是求法解析 还有一个例子详解 第一部分是求法解析 将对first集 follow集 select集分为三种讲解方法 定义介绍
  • pyspark对字段加前缀,拼接字符串

    代码逻辑 在df中 当字段main task id为 0 时 则对字段sub task id加前缀 check 否则取其本身的值 正确代码如下 df2 df withColumn sub task id when col main task
  • SQL窗口函数的使用

    定义 窗口函数 又叫OLAP Online Anallytical Processing 函数 可对数据库数据进行实时分析处理 功能 同时分组和排序 不减少原表的行数 区别于聚合函数 每行数据都生成一个结果 使用场景 排名问题 topN问题