select函数_SQL高级功能:窗口函数

74d96c5dd410894d0b1e064e4bf4afe0.png

一、窗口函数有什么用?

在日常生活中,经常会遇到需要在每组内排名,比如下面的业务需求:

排名问题:每个部门按业绩来排名

topN问题:找出每个部门排名前N的员工进行奖励

面对这类需求,就需要使用sql的高级功能窗口函数了。

二、什么是窗口函数,也叫OLAP函数(Online Anallytical Processing,联机分析处理),可以对数据库数据进行实时分析处理。

窗口函数基本语法如下:

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

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

1)专用窗口函数:rank,dense_ rank, row_number

2) 聚合函数:sum,avg,count,max,min

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

1.专用窗口函数rank

a08bb3f0e104c0a7723176bd5ac22c12.png

想要每个班级内按成绩排名的结果

select *,
rank() over(partition by 班级 order by 成绩 desc) as ranking
from 班级表

b7f8fc99feeec4eb1f85ba2c2e159e55.png

为什么叫“窗口”函数?

因为partition by分组后的结果称为“窗口”,表示“范围”的意思。

简单来说,窗口函数有以下功能:

1)同时具有分组和排序的功能

2)不减少原表的行数

3)语法见前

2.专用窗口函数rank,dense_rank, row_number有什么区别?

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_num
from 班级表

15e97823a872c788dd7d58989cce78ff.png

从上面结果可以看出:

rank 函数:如果有并列名次的行,会占用下一名次的位置。

dense_rank 函数:如果有并列名次的行,不占用下一名次的位置。

row_number函数:不考虑并列名次的情况。

3. top N问题

每组最大的N条记录

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

4.聚合窗口函数

select *,
sum(成绩) over(order by 学号) as current_sum
from 班级表

e91bf869b7a24fdc5fa9aa6d01797e69.png

如上图,聚合函数sum在窗口函数中,是对自身记录、及位于自身记录以上的数据进行求和的结果。平均、计数、最大最小值也是同理。

这样使用窗口函数有什么用?

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

5.查找单科成绩高于该科目平均成绩的学生名单

1)窗口函数法

select * 
from(select *,avg(成绩) over(partition by 科目) as avg_score from 成绩表) as b
where 成绩>avg_score

2)关联子查询法

见之前文章

6.窗口函数的移动平均

select *,
avg(成绩) over(order by 学号 rows 2 preceding) as current_avg
from 班级表

232394e5933cd8993f97ed388c7be29c.png

每一行得到的结果,都是当前行和前面2行的平均(共3行)。

这样使用窗口函数有什么用呢?

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/537296.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

客户端C++与前端js交互

客户端与前端交互 qwebchannel.js文件引入建立通信// c发送消息给js new QWebChannel(qt.webChannelTransport, function(channel){var content channel.objects.jsContext;// 建立通信后&#xff0c;客户端通过调用 sMsg 方法来执行后面的回调函数&#xff0c;从而实现c与j…

python动态映射_sqlalchemy动态映射

似乎您可以直接使用属性&#xff0c;而不是使用columnsdict。考虑以下设置&#xff1a;from sqlalchemy import Table, Column, Integer, Unicode, MetaData, create_enginefrom sqlalchemy.orm import mapper, create_sessionclass Word(object):passwordColumns [english, k…

linux外接显示屏,关掉本身的笔记本电脑

https://blog.csdn.net/a2020883119/article/details/79561035 先用xrandr命令查看&#xff1a; eDP-1 connected eDP-1是连接着的 关掉&#xff1a;sudo xrandr --output eDP-1 --off 打开&#xff1a;sudo xrandr --output eDP-1 --auto

发挥项目“临时性”威力,让项目顺利实施

所谓临时性,就是要有明确的“开始”和“结束”。虽然大家都知道项目一定会有开始和结束的,但要更多地关注“明确“。 问题1:问商务(售前)或业主,这个项目什么时候结束? 答:商务或业主他们有时候也不知道,因为国内的项目大多数是提前开始交付,是一边交付,一边把里程…

上拉加载更多后台数据_6-7【微信小程序全栈开发课程】记录页面(七)--分页加载记录数据...

现在是一次性加载所有的记录数据&#xff0c;数据多的时候&#xff0c;会加载比较慢&#xff0c;所以我们改成分页加载&#xff0c;一次最多加载15条数据每次拉倒底部都会自动加载下一页的数据&#xff0c;知道所有的数据加载完成1、添加data变量编辑record.vue文件&#xff0c…

spring cloud eureka服务注册和调用

SPRING INITIALIZR构建工程 spring boot 可通过SPRING INITIALIZR构建项目访问SPRING INITIALIZR官网&#xff0c;填写项目相关信息后&#xff0c;生成项目。将下载的项目解压&#xff0c;打开idea&#xff0c;file-->new-->project from existing sources。import proje…

去从事有门槛有积累的工作

现在社会的IT工作&#xff0c;一时风光无限&#xff0c;但是积累性不足。跟老外比较起来&#xff0c;国内的IT算是民工级别的。再加上&#xff0c;前些年的培训机构&#xff0c;不断的输出水平很次但很能加班的「人才」进入这个行业&#xff0c;「劣币驱逐良币」的效果下&#…

打印工资条怎么做到每个人都有表头明细_朋友说:能不能用python,帮我写一个“制作工资条”的自动化程序?...

本文说明今天和一个朋友吃饭&#xff0c;她说我经常使用Excel制作工资条&#xff0c;但是每个月都要做一遍&#xff0c;你能不能用python写一个代码&#xff0c;能够自动化完成这个工作。这当然可以啦&#xff0c;就是这么牛逼&#xff01;我们先来看看原始数据是什么样子的。那…

自定义按钮 图片标题位置随意放置

自定义按钮UIControl 写在前面 #图标和文字在一起是开发难免的问题&#xff0c;系统的按钮默认是图片居左的文字居右的&#xff0c; 且图片和文字的距离不好调整&#xff0c;图片的位置更是让人头疼&#xff0c; 故在闲暇之余封装了一个控件。 复制代码所用到知识的 # 1、苹果系…

做优化的数据库工程师请参考!CynosDB的计算层设计优化揭秘

本文由云社区发表本文作者&#xff1a;孙旭&#xff0c;腾讯数据库开发工程师&#xff0c;9年数据库内核开发经验&#xff1b;熟悉数据库查询处理&#xff0c;并发控制&#xff0c;日志以及存储系统&#xff1b;熟悉PostgreSQL&#xff08;Greenplum&#xff0c;PGXC等&#xf…

netty发送数据_看完这篇还不清楚Netty的内存管理,那我就哭了

说明在学习Netty的时候&#xff0c;ByteBuf随处可见&#xff0c;但是如何高效分配ByteBuf还是很复杂的&#xff0c;Netty的池化内存分配这块还是比较难的&#xff0c;很多人学习过&#xff0c;看过但是还是云里雾里的&#xff0c;本篇文章就是主要来讲解&#xff1a;Netty分配池…

数字化改革体系架构“152”两次迭代升级为“1612”

数字化改革体系架构已经完成两次迭代&#xff0c;152-1512-1612。 2021年&#xff0c;浙江在全国率先启动一项关系全局、影响深远、制胜未来的重大集成改革——数字化改革&#xff0c;并确定为全面深化改革的总抓手。 2021年2月18日&#xff0c;数字化改革大会“152”工作体系…

微软希望每个人有自己的人工智能朋友

微软正在和其他公司那样投资和研发人工智能技术&#xff0c;同时微软也希望人工智能技术能够深入我们的日常生活。 为此微软正在申请新的专利技术希望每个人在社交网络上都有自己的人工智能朋友可以随时随地的沟通交流。 实际上该专利属于已经实践的内容再来申请专利技术的&…

python 40位的数减个位数_Python数据分析入门教程(五):数据运算

作者 | CDA数据分析师进行到这一步就可以算是开始正式的烹饪了&#xff0c;在这部分之前的数据操作部分我们列举了一些不同维度的分析指标&#xff0c;这一章我们主要看看这些指标都是怎么计算出来的。一、算术运算算术运算就是基本的加减乘除&#xff0c;在Excel或者Python中数…

数字化改革“152”体系详解

架构图 “1” 即一体化智能化公共数据平台&#xff08;平台大脑&#xff09;&#xff0c;按照“统一规划、统一支撑、统一架构、统一平台、统一标准、统一建设、统一管理、统一运维"的要求&#xff0c;建设省市县三级公共数据平台&#xff0c;叠加三级“大脑功能&#xf…

数字化改革“141”体系

县级以上是“152”大框架&#xff0c;县以下是“141”体系。 141体系是&#xff1a;县级社会治理中心、乡镇&#xff08;街道&#xff09;基层治理“四个平台”、村社网格。 “1” 第一个“1”指县级社会治理中心。 “4” 第二个“4”指乡镇&#xff08;街道&#xff09;基…

spring boot——MockMvc的用法

1.pom配置 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId> </dependency> 2.所需对象及Controller public class User {private String id;private String username;private…

python一元加号_Python一元方程解算系统(需要Sympy库支持)

解算案例本文为实现python一元方程解算的源码案例(后续不定期更新)# -*- coding: UTF-8 -*-from sympy import *#设置一些可能抛出的异常def Warn(type):if type "missEquater":print "You missed the euqater!"elif type "excessiveEquater":…

接口做的好怎么形容_淘宝直播预告怎么做才合格?如何做好?

很多淘宝商家在直播前没有做淘宝直播预告&#xff0c;或者不知道怎么去做直播预告&#xff0c;这对直播的效果会有很大的影响&#xff0c;那么直播前如何做好直播预告呢?怎样的直播预告才是合格的&#xff0c;下面来了解一下。1.必须去淘宝直播中控台发布。因为手机上发布目前…

“1+7+N”改革工作体系介绍

2021年&#xff0c;浙江省确定了“17N”的改革工作体系&#xff0c;要求以全面深化改革新成效再创体制机制新优势。&#xff08;2022年已经升级为“1612N”&#xff0c;点击阅读&#xff09; “1” 数字化改革&#xff0c;这是浙江全面深化改革的总抓手。将聚焦打造全球数字变…