开窗函数的意义与用法

开窗函数——排序函数

开窗函数与其他函数的区别是,它不是关联其他表查询,而是在一张表内根据我们的想法自定义的规则分组后对我们组内的数据进行检索和计算。我们自定义的规则所分的组,就如同整张表的一个个小窗口,因此我们开出一个个小窗口并对这些小窗口进行的操作就叫做开窗函数。
开窗函数分为排序函数和聚合函数。

一、排序函数:

1.三个排序函数

句型:row_number()的排序函数

order_func OVER([PARTITION BY expression] ORDER BY clase)

其中,order_func是指排序函数,包括:
row_number(),rank(),dense_rank(),ntile();
他们会为每一行返回一个序值。
PARTITION BY 是我们自定义的分组策略,如果不用,该函数会把其余select 语句包括where、having、group by的运行结果做为窗口进行排序;ORDER BY 是排序的方法,即每个窗口内根据哪个字段排序,不能缺省
例如:我们需要对一个包含4个班级的16个同学的成绩表进行以班为单位的排序,我们可以这样排序:

select st_name,st_class,st_score,row_number() over(partition by st_class order by score)  as '名次'
from score_tab;

但有时候我们的业务需求我们排序,但不以表中的字段排。而我们又不能没有ORDER BY语句,我们应该怎么办呢?是的,开发者也考虑到了:

select st_name,st_class,st_score,row_number() over(partition by st_class order by (select 0))  as '名次'
from score_tab;

当然,这并不是所有sql家族成员都是这么设计的,比如hive的方法就略有不同:

select st_name,st_class,st_score,row_number() over(partition by st_class order by 0)  as '序值'
from score_tab;

直接用0,并不用select 0;
当然,这种排序也是有弊端的,就拿我们的学习成绩为例,假如同一个窗口内的两个同学分数相同,我们按这种方法排,可能他们一个是第二名,一个是第三名,这样对孩子就太不公平了。于是,我们又有了另外两种排序方式:
rank()和dense_rank()
三者的区别是:

row_number() 对窗口每一行记录输出一个序值,同一窗口不会有重复的充值,无论排序字段值是否相等,都是1,2,3,4;
rank() 对窗口内每一行记录输出一个序值,字段值相同的,则输出相同序值,下一充值为非密集排序,如1224;
dense_rank() 对窗口内每一行记录输出一个充值,字段值相同的,则输出相同序值,下一序值为密集排序,如:1,2,2,3;

2.数据均分分组函数–NTILE()

NTILE()的功能是进行均分分组,其参数是我们要分组的数量,比如,我们把学生平均分为四组,

select st_name,, st_class,,st_score,NTILE(4) OVER(ORDER BY st_score) as '分组'
from score_tab;

结果是按照成绩排列为1,2,3,4组,部分数据如下:

st_namest_classst_score分组
a1681
c4691
r3721
d4851

如果我们按班级为单位,把每一个班的成绩平均分为高、下两种评级,则:

select st_name,, st_class,,st_score,CASE NTILE(2) OVER(PARTITION BY st_class ORDER BY st_score) when 1 then '低'when 1 then '高'END ASlevelfrom score_tab;
st_namest_classst_scorelevel
p469
g475
e487
j492

总结:

一般我们在使用排序函数的时候,我们不会同时使用distinct,因为我们在给记录进行排序时,一般会忽略同值记录,事实上我们执行如下语法,其中的distinct并没有起作用,不会去重,只是增加了资源的开销:

SELECT DISTINCT st_score,ROW_NUMBER() OVER(PARTITION BY st_class ORDER BY st_score) AS '排名'
FROM score_tab;

如果我们业务真实需要去重后再编序值,请用过滤条件GROUP BY,如:

SELECT st_score,ROW_NUMBER() OVER(PARTITION BY st_class ORDER BY st_score) AS '排名'
FROM score_tab
GROUP BY st_score;

相关:替代方案–子查询

在开窗函数没有发布之前,我们进行窗口操作都是使用子查询进行的,其原理为:先查出该组内比当前成绩低的个数,再加上1,就是该学生在该组的序值,如:

select st_name,st_class,st_score--开窗函数方式,row_number() over(partition by st_class order by score) as '开窗序值名次'--子查询(SELECT COUNT(1)+1 FORM st_score s2WHERE s2.st_class=a1.st_class AND s2.st_score<s1.st_score) as 子查询名次
from score_tab s1;--如果是密集排序,我们只需把count()的参数改为排序字段即可去重,如
select st_name,st_class,st_score--开窗函数方式,row_number() over(partition by st_class order by score) as '开窗序值名次'--子查询(SELECT COUNT(st_score)+1 FORM st_score s2WHERE s2.st_class=a1.st_class AND s2.st_score<s1.st_score) as 子查询名次
from score_tab s1;

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

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

相关文章

mysql/sqlyog导入txt文件的方法

今天尝试着用sqlyog向mysql中导入数据&#xff0c;用了以下几种&#xff1a; 一、sql载入 格式&#xff1a; LOAD DATA LOCAL INFILE 文件路径 INTO TABLE 表名 FIELDS TERMINATED BY 字段分隔符 LINES TERMINATED BY 行分隔符;直接进去了 代码&#xff1a; LOAD DATA LOCA…

XSS知识总结

XSS基础 跨站脚本&#xff08;英语&#xff1a;Cross-site scripting&#xff0c;通常简称为&#xff1a;XSS&#xff09;是一种网站应用程序的安全漏洞攻击&#xff0c;是代码注入的一种。它允许恶意用户将代码注入到网页上&#xff0c;其他用户在观看网页时就会受到影响。这…

2020有效的邮箱号大全_2020年公众号免费裂变涨粉的3个有效方法,让我一天涨粉6000...

文章来源我的公众号&#xff1a;运营小小喵&#xff08;专注分享新媒体运营干货、写作技巧&#xff09;虽然公众号一直被唱衰&#xff0c;但至今依然还有很多人坚持在做。但现在做公众号最大的问题&#xff0c;除了流量大幅下降&#xff0c;打开率越来越低&#xff0c;更重要的…

Error during job, obtaining debugging information...

今天在插入数据的时候出现错误:Error during job, obtaining debugging information… Ended Job job_1575898012755_0005 with errors Error during job, obtaining debugging information... Examining task ID: task_1575898012755_0005_m_000000 (and more) from job job…

java实现 XSS攻击防护

首先说一下什么是XSS攻击 XSS攻击全称跨站脚本攻击&#xff0c;是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆&#xff0c; 故将跨站脚本攻击缩写为XSS&#xff0c;XSS是一种在web应用中的计算机安全漏洞&#xff0c;它允许恶意web 用户将代码植入到提供给其它用…

动态分区添加的新字段无法插入数据

我们在使用动态分区的进程中&#xff0c;有时候需要新增字段&#xff0c;新增之后&#xff0c;发现该字段一直为空&#xff0c;无论怎么插入数据&#xff0c;该字段值始终不变。过去的做法就是把表删了&#xff0c;重建带新字段的新表&#xff0c;问题就解决了&#xff0c;今天…

Java实现XSS防御

XSS概述 跨站脚本攻击(Cross Site Scripting)&#xff0c;缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码&#xff0c;当用户浏览该页之时&#xff0c;嵌入其中Web里面的Script代码会被执行&#xff0c;从而达到恶意攻击用户的目的。 Servlet的方式 1、继承HttpServle…

classmethod 继承_让人眼花缭乱的类继承

Python语言的一个优势是简洁易用。是否简洁易用仅仅是Python语言本身的一个话题&#xff0c;但“好消息”是如果你想创造那种一大堆继承、混乱的内部关系的代码&#xff0c;也是可以的&#xff01;今天烦人的代码来自于验证某些math-y数学分析代码。一开始&#xff0c;他们是发…

SQL优化之浅见

SQL优化之浅见一、查询优化二、导入大量数据时的优化三、INSERT优化四、字段注释五、说明用了段mysql/Oracle/hive等数据库,对SQL语言以Mysql为例&#xff0c;总结一下对sql优化方面的见解&#xff0c;欢迎大家补充。 一、查询优化 1.在关联查询中&#xff0c;关联键的数据类…

JAVA SSM框架+Redis 实现单点登录

1&#xff1a;什么是单点登录&#xff1f; 答&#xff1a;单点登录的英文名叫做&#xff1a;Single Sign On&#xff08;简称SSO&#xff09; 一般我们的模块都是在同一个系统下&#xff0c;同一个tomcat&#xff08;如图&#xff0c;以商城为例&#xff09; 后来为了维护和…

2017云栖大会门票转让_「揭秘GP」云栖大会 | Greenplum 6.0 内核优化解读和7.0展望...

9月25日&#xff0c;云栖大会在杭州阿里巴巴云栖小镇正式拉开序幕&#xff0c;三天会议期间&#xff0c;共吸引了200多位世界级科学家、400多家科技合作伙伴参与&#xff0c;科技展区面积超过3万平方米&#xff0c;共发布了1000多项顶尖技术。云栖大会现场在此次云栖大会上&…

从mysql到大数据(一)--开宗明义

一、大数据长什么样 长像很普通&#xff0c;至少看两眼后就觉得很平常。 举个栗子&#xff1a; 一个表格&#xff0c;学生信息表&#xff0c;里面有学号、姓名、性别、年龄、学校、学院、专业、年级、宿舍号等信息如下&#xff0c; 但是表在库里&#xff0c;我们想看&#xf…

SSO单点登录方案大全

分布式微服务系统主流常用的登录方案 前言: 单点登录其实是一个概念,主要是为了解决一次登录,多系统(本系统或外部系统)之间不需要重复登录的问题,就目前来说,主流的解决方案针对业务场景分为3个方向: 1: 同一公司,同父域下的单点登录解决方案. 如[http://map.baidu.com][[h…

em算法怎么对应原有分类_机器学习基础-EM算法

EM算法也称期望最大化(Expectation-Maximum,简称EM)算法&#xff0c;它是一个基础算法&#xff0c;是很多机器学习领域算法的基础&#xff0c;比如隐式马尔科夫算法(HMM)&#xff0c; LDA主题模型的变分推断等等。本文就对EM算法的原理做一个总结。EM算法要解决的问题我们经常会…

从mysql到大数据(二)--数据库的认识

一、数据库的认识 数据库顾名思义&#xff0c;是存放数据的库房。 二、数据库的分类&#xff08;了解&#xff09; 可以分为两大类&#xff1a;关系型数据库和非关系型数据库。 关系型数据库&#xff1a; 关系型数据库&#xff0c;存储的格式可以直观地反映实体间的关系。…

postman插件下载、安装教程

这里只讲如何在Chrome 中安装postman插件 下载链接&#xff1a;https://pan.baidu.com/s/1vampHeD0UiDNbrB3G8j_hA 提取码&#xff1a;wqdl 方法/步骤 1.在Chrome输入地址&#xff1a;[chrome://extensions/] 2.将压缩包直接拖拽至Chrome中 3.运行在Chrome输入地址&#xff…

得力条码扫描器怎么用_广东智能物流控制系统怎么选

广东智能物流控制系统怎么选&#xff0c;东莞智库&#xff0c;东莞智库(SmartWarehouse)&#xff0c;专注电子制造SMT智能仓库&#xff0c;致力于帮助电子制造企业提高物流仓储效率和效能。广东智能物流控制系统怎么选&#xff0c; 旭日东自动分拣系统是个集机械、电气、计算机…

从mysql到大数据(三)--mysql数据库建模一常用数据类型及引擎

数据库的安装请自行百度。如果你想直捣黄龙练查询&#xff0c;没有表没有数据是不能实现的。我们从建表开始学习。但要知道&#xff0c;我们所有东西都是了解&#xff0c;学习不要有压力&#xff0c;不要必须要求记什么&#xff0c;当然&#xff0c;如果你不累可以记&#xff0…

Postman用法简介-Http请求模拟工具

Postman用法简介-Http请求模拟工具 在我们平时开发中&#xff0c;特别是需要与接口打交道时&#xff0c;无论是写接口还是用接口&#xff0c;拿到接口后肯定都得提前测试一下&#xff0c;这样的话就非常需要有一个比较给力的Http请求模拟工具&#xff0c;现在流行的这种工具也…

matlab多元函数_函数的计算机处理8(1)_1MATLAB

计算机语言运用--数值计算8-函数的计算机处理8(1)_1MATLAB计算机&#xff1a;电子线路组成的计算机器。人与计算机则是通过计算机语言-符号系统说给计算机听而交流。计算机语言有低级语言-机器语言、汇编、高级语言-C/C/C#/VB/PASCAL/LISP/JAVA/PYTHON/……成百上千种之多。 作…