点击关注上方“SQL数据库开发”,

设为“置顶或星标”,第一时间送达干货

SQL专栏

SQL基础知识第二版
SQL高级知识第二版

今天给大家介绍一下SQL Server排名中经常用到的ROW_NUMBER(),RANK(),DENSE_RANK(),NTILE()这四个好兄弟。

我们先创建一个测试数据表Scores

WITH t AS
(SELECT 1 StuID,70 Score
UNION ALL
SELECT 2,85
UNION ALL
SELECT 3,85
UNION ALL
SELECT 4,80
UNION ALL
SELECT 5,74
)
SELECT * INTO Scores FROM t;
SELECT * FROM Scores

结果如下:

1、ROW_NUMBER()

定义:ROW_NUMBER()函数作用就是将SELECT查询到的数据进行排序,每一条数据加一个序号,他不能用做于学生成绩的排名,一般多用于分页查询,比如查询前10个 查询10-100个学生。

1.1 对学生成绩排序

示例

SELECT
ROW_NUMBER() OVER (ORDER BY SCORE DESC) AS [RANK],*
FROM Scores;

(提示:可以左右滑动代码)

结果如下:

这里RANK就是每个学生的排名后的次序, 根据Score进行DESC倒序

1.2 获取第2名的成绩信息

SELECT * FROM (
SELECT ROW_NUMBER() OVER (ORDER BY SCORE DESC) AS [RANK],*
FROM Scores
) t WHERE t.RANK=2;

结果:

这里用到的思想就是 分页查询的思想 在原sql外再套一层SELECT
WHERE t.RANK>=1 AND t.RANK<=3 是不是就是获取前三名学生的成绩信息了。

2、RANK() 

定义:RANK()函数,顾名思义排名函数,可以对某一个字段进行排名,这里和ROW_NUMBER()有什么不一样呢?ROW_NUMBER()是排序,当存在相同成绩的学生时,ROW_NUMBER()会依次进行排序,他们序号不相同,而Rank()则不一样。如果出现相同的,他们的排名是一样的。下面看例子:

示例

SELECT ROW_NUMBER() OVER (ORDER BY SCORE DESC) AS [RANK],*
FROM Scores;

SELECT RANK() OVER (ORDER BY SCORE DESC) AS [RANK],*
FROM Scores;

结果:

上面是ROW_NUMBER()函数的结果,下面是RANK()函数的结果。

当出现两个学生成绩相同是里面出现变化。RANK()是1-1-3-4-5,而ROW_NUMBER()则还是1-2-3-4-5,这就是RANK()和ROW_NUMBER()的区别了

3、DENSE_RANK() 

定义:DENSE_RANK()函数也是排名函数,和RANK()功能相似,也是对字段进行排名,那它和RANK()到底有什么不同那?特别是对于有成绩相同的情况,DENSE_RANK()排名是连续的,RANK()是跳跃的排名,一般情况下用的排名函数就是RANK() 我们看例子:

示例

SELECT
RANK() OVER (ORDER BY SCORE DESC) AS [RANK],*
FROM Scores;

SELECT
DENSE_RANK() OVER (ORDER BY SCORE DESC) AS [RANK],*
FROM Scores;

结果:

上面是RANK()的结果,下面是DENSE_RANK()的结果

4、NTILE()

定义:NTILE()函数是将有序分区中的行分发到指定数目的组中,各个组有编号,编号从1开始,就像我们说的'分区'一样 ,分为几个区,一个区会有多少个。  

SELECT NTILE(1) OVER (ORDER BY SCORE DESC) AS [RANK],* FROM Scores;

SELECT NTILE(2) OVER (ORDER BY SCORE DESC) AS [RANK],* FROM Scores;

SELECT NTILE(3) OVER (ORDER BY SCORE DESC) AS [RANK],* FROM Scores;

结果:

就是将查询出来的记录根据NTILE函数里的参数进行平分分区。

这几兄弟就介绍完了,有空再给大家介绍分组排名的问题。

最后给大家分享我写的SQL两件套:《SQL基础知识第二版》和《SQL高级知识第二版》的PDF电子版。里面有各个语法的解释、大量的实例讲解和批注等等,非常通俗易懂,方便大家跟着一起来实操。有需要的读者可以下载学习,在下面的公众号「数据前线」(非本号)后台回复关键字:SQL,就行数据前线
后台回复关键字:1024,获取一份精心整理的技术干货
后台回复关键字:进群,带你进入高手如云的交流群
记得帮忙点「赞」和「在看」↓
谢谢啦

详解SQL中的排名问题相关推荐

  1. 详解SQL中Groupings Sets 语句的功能和底层实现逻辑

    前言 SQL 中  Group By  语句大家都很熟悉, 根据指定的规则对数据进行分组 ,常常和 聚合函数 一起使用. 比如,考虑有表  dealer ,表中数据如下: 如果执行 SQL 语句  S ...

  2. Case When语句详解SQL中Case When的用法

    SQL中case when的用法 case when类似于编程语言中的if else判断.switch case语句.该语句执行时先对条件进行判断,然后根据判断结果做出相应的操作. Case具有两种格 ...

  3. sql去重复操作详解SQL中distinct的用法

    在表中,可能会包含重复值.这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值.关键词 distinct用于返回唯一不同的值. 表A: 表B: 1.作用于单列 select dist ...

  4. mysql中groupby用法_详解SQL中GroupBy的用法

    GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组. 1.概述 "Group By"从字面意义上理解就是根据"By"指定的规则对数据进行分 ...

  5. 详解SQL中的触发器

    ● 原因 ● 触发器 ○ 简介 ○ 分类 ○ INSERTED和DELETED ○ 优缺点 ● 语法 ○ 建立触发器 ○ 删除触发器 ○ 修改触发器 ○ 开启和禁用 ○ 提醒和保护 ● 示例 原因 今 ...

  6. 详解SQL中几种常用的表连接方式!

    导读:数据库性能优化最主要的就是SQL优化,SQL优化的关键离不开三点:表的连接方式.访问路径和执行顺序,本文重点介绍几种常见的连接方式. 多表关联查询,查询优化器的执行步骤具体如下. 1)访问路径: ...

  7. 详解SQL中drop、delete和truncate的异同

    第一:相同点: truncate和不带where子句的delete,以及drop 都会删除表内的数据 第二:不同点: 1. truncate和delete只删除数据不删除表的结构(定义)     dr ...

  8. 【数据库基本原理】详解SQL标准中的隔离级别定义

    详解SQL标准中的隔离级别定义 SQL标准中隔离级别的初衷 SQL标准,已被ANSI 和ISO/IEC采用,定义了四种事务隔离级别.这些隔离级别在事务处理吞吐量上游不同程度的影响. 这些隔离级别根据并 ...

  9. dataframe groupby_详解pandas中的map、apply、applymap、groupby、agg.

    一.简介 pandas提供了很多方便简洁的方法,用于对单列.多列数据进行批量运算或分组聚合运算,熟悉这些方法后可极大地提升数据分析的效率,也会使得你的代码更加地优雅简洁. 本文就将针对pandas中的 ...

最新文章

  1. 白话Elasticsearch48-深入聚合数据分析之 Percentiles Aggregation-percentiles百分比算法以及网站访问时延统计及Percentiles优化
  2. 巨蟒django之CRM5 学习记录课程记录班级管理私户的数量上限
  3. Leetcode PHP题解--D5 804. Unique Morse Code Words
  4. centos7添加新网卡实现双IP双网关
  5. 四种为HttpClient添加默认请求报头的解决方案
  6. web系统数据库服务器,Web Gateway
  7. python列表转换成数字_python 字母转成数字Python操作列表的常用方法总结
  8. C语言中全局变量和局部变量,作用域与生命周期的相关问题。
  9. 马吕斯定律matlab拟合,Matlab插值模拟在光的偏振中的应用
  10. adb工具 手工操作android模拟器上的数据库
  11. Sqlite使用简单教程
  12. 自定义ArrayStack
  13. 飞卢服务器维护什么时候结束,2019年10月8日定期维护公告
  14. 深入浅出mysql csdn_《深入浅出MySQL:数据库开发、优化与管理维护
  15. STM32F072单片机的低功耗实验/STOP模式低功耗调试
  16. python爬虫案例(2)
  17. android开机logo制作
  18. 笔记本电脑+第二块显示屏如何双屏操作
  19. 红黑树 之 原理和算法详细介绍
  20. 【Unity】光照贴图动态加载

热门文章

  1. python马士兵学习笔记
  2. Cesium.js移除自带地形和影像
  3. 第955期机器学习日报(2017-04-30)
  4. C语言设计第七章答案,c语言程序设计第七章答案
  5. android4.0.3源码之硬件gps简单移植
  6. 回收站清空文件的数据怎么找回
  7. 我们注意到您的计算机目前处于离线状态_目前处于“离线”状态的天天动听,是否还能够勾起你以前的回忆?...
  8. 整理:著名软件是使用什么语言写的?
  9. *.REP和*.PHO文件是什么文件?为什么在GERBERCAM里导入这两种文件时,无法将元件坐标转出来?
  10. 内核月报搜索exe版 代码