sql 除以_不可思议的SQL排名函数,被您无视了么?

经常写SQL脚本的朋友,对查询的多样化要求可能会经常头疼。数据库SQL的语法是固定的、但应用要求却是千差万别的。依靠我们所掌握的知识,大部分的查询需求我们还是有办法的解决的,但总有那么一些要求,把我们搞的非常被动。

6428504d058ac6b46bfda7cb4400fec3.png

今天我们就谈一个会让我们头疼的问题:如何对查询的结果进行排名。没错,是排名,不是排序,跟Order By有点关系,但可以认为是另一个问题。排名函数不但可以实现排序,还能够生成排序的排名序列

演示数据准备

今天我们就以SQL Server为例,结合四大排名函数,详细讲解一下如何使用四大排名函数实现查询结果的排名。MySQL也有类似的排名函数,使用方法与SQL Server大同小异

为了演示需要,我们需要先创建一个表变量作为销售表,记录不同区域、城市、年月的销售金额,然后再对表中的数据进行排名处理。演示数据创建脚本如下:

declare @sale table( FName nvarchar(50), FDistrict nvarchar(50), FYear smallint, FMonth smallint, FAmount decimal(28,10));insert into @salevalues('张三','北京',2019,4,20000),('张三','深圳',2019,4,40000),('李四','北京',2019,4,30000),('李四','深圳',2019,4,40000),('王二','北京',2019,4,70000),('王二','深圳',2019,4,60000),('马六','北京',2019,4,80000),('马六','深圳',2019,4,70000);

运行结果请参考下图:

d15367dbab0da53662182903e8756b91.png

有了演示数据,我们就把四个排名函数的应用和区别挨个理一理。

ROW_NUMBER,简单方便又强大

row_number是最常用、最简单的排名函数,其语法格式如下:

row_number() over(order by field列表 asc|desc)

语法格式看上去有点怪怪的,前半截row_number()是排名函数,紧接其后的over子句则是指定排序的规则。其它三个排名函数也有over子句,用途和语法也是一样的。整个函数作为一个整体,其返回值就是排名序列号,序列号从1开始依次累加。

比如我们要按照销售金额进行排名,语法格式如下:

select ROW_NUMBER() over(order by FAmount desc) as FRank,* from @sale;

运行效果参考下图:

4691bd3b01c703dd1504fa224976aba8.png

通过上图的查询结果可以看出,FRank字段就是返回的排名字段。根据over子句,可以定义任何自己需要的排名规则。

如果您认为row_number函数只是能实现如此排名,那您就想的太简单了。row_number函数还有一个很重要的扩展用途,可以实现查询分页,我们举一个例子来说明如何使用row_number实现查询分页。

为了使演示效果更明显,我们使用公用表表达式返回排名序列值和数据,根据要求的每页行数和第几页,通过where子句限定排名序列的起点和终点。

declare @pagesize int =4;--每页记录数declare @pagenum int =1;--第几页with cte as( select row_number() over(order by FAmount desc) as FRank,* from @sale)select * from ctewhere FRank between  @pagesize*(@pagenum-1)+1  and  @pagenum*@pagesize;

运行效果如下图所示:

0f85a1c06fb5453f02ed357199888ccb.png

这种写法基本是通用的,您可以比葫芦画瓢稍加改造,就可以用在您的分页脚本中。

如果在查询中使用order by子句,要注意order by子句最好与排名中over子句的order by一致,如果不一致,可能导致返回排名序列是不连续的,但这并不影响数据页的正确性。

还有一种可以实现分页写法,使用offset进行分页,这里我就不再赘述了。如果您想要更进一步了解分页语法,可以参考我之前写过的文章《如何在SQLServer查询中实现高效分页》。

RANK,相同值共用排名值,跳着排

RANK函数与ROW_NUMBER函数的语法和效果类似,最大的区别在于,如果碰到相同的字段值,会使用相同的排名序列值,后续的序列值则会跳过共用序列值。

其语法格式如下:

rank() over(order by field列表 asc|desc)

下面我们就实战一下:

select RANK() over(order by FAmount desc) as FRank,* from @sale;

运行效果如下图所示:

845fed05271023e9b63f2df7493a01d2.png

我们从上图可以很明显看出来,第2、3条记录因值相同,使用了相同的序列值“2”,到了第四条,排名序列值直接使用了“4”而跳过了“3”。

DENSE_RANK,相同值共用排名值,接着排

DENSE_RANK函数与RANK函数的语法和效果类似,区别就像函数名称中的DENSE(紧密的)含义一样,如果碰到相同的字段值,虽然都会使用相同的排名序列值,但序列值是连续的。

其语法格式如下:

dense_rank() over(order by field列表 asc|desc)

下面我们就实战一下:

select DENSE_RANK() over(order by FAmount desc) as FRank,* from @sale;

运行效果如下图所示:

407acfad263e5e0a2c6155ae950c2724.png

可以看出RANK和DENSE_RANK确实有共同点,但也有区别。RANK排名值如果碰到相同字段值,则会使用相同的排名值,后续会跳过断开使用新的排名值;DENSE_RANK碰到相同字段值同样使用相同的排名值,但是接着排下来,不会断开

NTILE,根据约定分组

NTILE函数的语法和用途上面三个明显不同,其功能主要用来实现对记录进行分组。根据NTILE约定分组的组数,将查询结果按照over子句的排序标准进行分组,分组组号按照序列排列,同一个组使用同一个组号。

其语法格式如下:

ntile(组数) over(order by field列表 asc|desc)

如果指定的组数刚好实现均分,则每一组的记录数是相同的,比如我们将8条记录分成四组,则会有四个组,组号分别是1、2、3、4,每一组都会有两个记录,举例如下:

select NTILE(4) over(order by FAmount desc) as FRank,* from @sale;

运行效果如下:

0920690d57a4802df98ff2ee40c459e0.png

如果分成五组,明显无法均分,那如何分呢?

当然是有一种逻辑存在的。这种逻辑可以这样理解,从第一组开始,使用总记录数除以组数,获取等于或最大于相除结果的最小整数,作为第一组的记录条数;剩余的记录条数按照相同算法依次类推。通俗来讲,NTITLE在优先配足靠前的分组的记录数的前提下,尽量进行均分。

下面我们我实战将以上记录分成五组的执行情况:

select NTILE(5) over(order by FAmount desc) as FRank,* from @sale;

运行效果如下:

7d03bb1680fd68c96d2cfcf68f14aa08.png

从上图可以看出,记录条数是8条,分成5组,我们用8除以5,最接近且大于等于的整数是2,第一组占用了两条记录,这时候还剩余6条记录分4组;依次类推,6除以4,最接近且大于等于的整数是2,第二组还是2条记录;此时剩余4条记录要分3组,4除以3,最接近且大于等于的整数还是2;再往下,剩余两条分两组,这时候就刚好均分了。

需要明确的是,NTILE也可用来分页,但因分组逻辑的原因,效果就不如ROW_NUMBER理想了。


通过上述分析,我们对排名函数就有了充分的认识,您大可根据需要使用。希望对您有所帮助!

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

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

相关文章

自制hdmi线一头改vga图_VGA连接线接口定义及引线焊接教程,VGA线不够长时可用网线代替?...

最近做的多媒体功能插座,含有VGA、HDMI、网口、音频输入等接口,由于穿线时没有穿成品线缆,VGA和HDMI接头需要焊接,那么怎么焊接呢?VGA接口15根针,其对应接口定义如下,其下图:一般在V…

sql 分组求和_数据仓库工具–Hive(归纳笔记第六部分:SQL练习)

写在开头:本章是Hive教程第六部分,着重于归纳SQL编写。文章内容输出来源:拉勾教育大数据高薪训练营。本章将介绍Hive中常见的面试题和自己的解答思路,以供大家训练和记忆。SQL面试题1、求连续7天登录的用户— 数据。uid dt status…

Tableau上面地图与条形图结合_何为计算的详细级别,认识Tableau中的Level of Detail...

何为详细级别详细级别,英文Level of detail,Tableau用它来描述计算发生的级别,或者说计算在哪个层级发生。由于BI工具的相似性,在Power BI里也可以用类似的思想对计算进行描述,但Power BI并没有与之对应的专门的词汇。…

java 异步读表,Java实现异步回调-Go语言中文社区

回调(callback)在我们做工程过程中经常会使用到,今天想整理一下回调的原理和使用方法。回调的原理可以简单理解为:A发送消息给B,B处理完后告诉A处理结果。再简单点就是A调用B,B调用A。那么是如何实现的呢?一般而言&…

mysql 按时间累计计算_精通MySQL索引背后的数据结构及算法原理

本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,mysql支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引&a…

matlab数据游标属性设置,将节点属性添加到图论图数据提示

绘制具有数据提示的 GraphPlot 对象创建随机有向图的 GraphPlot 图对象。将额外的节点属性 wifi 添加到该图。rng defaultG digraph(sprandn(20, 20, 0.05));G.Nodes.wifi randi([0 1], 20, 1) 1;h plot(G);向图中添加数据提示。利用数据提示,您能够选择图论图中…

matlab 邻近度 离群点_MATLAB自制迷宫游戏,快来试试吧!

前几天给大家介绍了“一行matlab代码可以做哪些匪夷所思的事情”,今天小编带给大家一款酷炫的私人订制版迷宫游戏。这款迷宫游戏包含以下功能:随机生成迷宫地图通过键盘手动求解生成的迷宫MATLAB自动求解生成的迷宫目前主流的生成迷宫的算法有&#xff1…

matlab中m文件的作用,M文件主要包含()_matlab中m文件的好处

M文件主要包含()答:M函数文件\n\nM命令文件(脚本文件)" src"" style"max-width: 100%; display: inline;">中国大学MOOC: 在缓冲区分析中二次模型的表示的主体对象对临近对象的影响随距离的增大呈线性衰减。答:错巡航速度是…

xcopy复制文件夹及其子文件_嗨学习:如何给电脑中文件夹设置密码

文件夹怎么设置密码,如何给文件夹设置密码?有些重要的文件或比较隐私的文件存放在电脑上,这些文件我们只希望自己能看到并使用,不希望别人访问。那么,最好的办法就是去对这些文件进行加密。 才不怕别人看到自己的隐私,设置密码&a…

php的修改数据库语句怎么写,php的数据库修改语句是什么

php的数据库修改语句是UPDATE,用于更新数据库表中已存在的记录,语法为【UPDATE table_name SET column1value, column2value2,...WHERE some_columnsome 】。本教程操作环境:windows7系统、PHP5.6版,DELL G3电脑。UPDATE 语句用于…

ubuntu20.04中安装划词翻译_教你轻松玩转免安装的网页翻译插件“有道网页翻译2.0”...

大家在日常网页浏览中肯定多多少少都会碰到英文网站,这时候往往需要花费非常多的时候去自行理解,效率低下,又或者借助浏览器自带的翻译功能进行翻译,但又可能遇到翻译不准的情况。现在这个问题可以解决啦!“有道网页翻…

python 主要内容,介绍一些有关python的重要内容

Python的参数传递方式是:位置,默认值,变量参数,关键词参数。传值究竟是函数的值传递还是引用传递,要分情况:不变参数用值传递:像整型和string这样的不变对象是通过拷贝来传递的,因为…

系统业务逻辑书籍_「樊登读书会强推:免费送10本绝密书」彻底改变你的逻辑思维能力...

哈喽~你好我是JS-冰冰今天在星巴克喝咖啡整理了一些巨大价值的绝密资料,从过往在樊登读书会整理的10本彻底改变《逻辑思维能力》的绝密电子书。非常实用,对我的改变和提升非常有帮助,所以想把这份改变命运的绝密大礼包也送给需要的小伙伴~(怎…

饿了么风神登录_海底捞首度登陆第三方外卖!联手饿了么全国配送“小火锅”...

近日,“海底捞”正式联手饿了么推出第三方外卖配送服务。据悉,这是海底捞首次与本地生活服务平台合作推出第三方外卖业务。包括上海、济南、福州、郑州等多个城市的用户登录饿了么平台,下单购买海底捞“小火锅”外送等产品后,便可…

数据相关的在职研究生_南方医科大学2020年招收在职博士研究生导师名单及复试考生名单!...

南方医科大学2020年在职博士研究生入围复试考生名单各位考生:根据我校招收2020年在职博士研究生相关工作规定,现就进入复试考生名单予以公示,请入围复试考生密切关注我校相关复试公告,做好复试准备。南方医科大学招收2020年在职博…

富文本++php+源码,自己实现富文本编辑器

【实例简介】网页中经常需要输入多种资料,自带的TextBox不够用【实例截图】【核心代码】//************************************************************************************//将texttemp内容移入iframeiframeDocument.body.innerHTML parent.document.getE…

gridlayoutmanager 设置间距_不设置主灯的客厅应当如何保证较好的灯光分布?

如果没有从事照明设计的专业人士或者是比较有经验的室内设计师协助业主做决策,个人不太建议普通业主自行设置“无主灯客厅”的灯光分布。在日常设计工作中,如果委托人确已考虑放弃主灯,通常我也会建议业主保留已有的客厅主灯的灯控线路及开关…

Oracle filter 函数,Oracle数据库之SQL单行函数---字符函数续

前一篇博客练习了一些字符函数,之后自己又去下查阅了相关的资料,上一篇博客中还有很多的字符函数没有练习到,这次主要是对上次的一些未用到的字符函数进行一些补充练习。ascii()返回与指定的字符对应的十进制数,若为字符串则返回字符串首字母…

怎么画单极交流放大电路波形图_珠海放大IC怎么样

容抗XC1/2πf c (f表示交流信号的频率,C表示电容容量)电话机中常用电容的种类有电解电容、瓷片电容、贴片电容、独石电容、钽电容和涤纶电容等。集成电路更着重电路的设计和布局布线,芯片更强调电路的集成、生产和封装。而广义的集成电路,当涉…

图片识别不了小程序怎么办_图片转文字【微信小程序】

文字识别小程序在文章的底部直接拉到文章底部就可使用↓↓↓↓↓↓工作中,很多时间需要把纸质文稿上的大段文字变成可编辑文字,有时我们会一个一个文字录入,有时我们可以采用扫描仪,我们也用过扫描全能王APP。这里给大家介绍一种方…