SQL中常用的四个排序函数,你用过几个?

我们在写SQL代码时,只要有排序,首先想到的肯定是ORDER BY,以至于好多小伙伴觉得排序多简单啊。

今天就给大家介绍四个你不怎么常用排序函数,他们就是SQL Server排序中经常用到的ROW_NUMBER(),RANK(),DENSE_RANK(),NTILE()这四个好兄弟。

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

  1. WITH t AS

  2. (SELECT 1 StuID,70 Score

  3. UNION ALL

  4. SELECT 2,85

  5. UNION ALL

  6. SELECT 3,85

  7. UNION ALL

  8. SELECT 4,80

  9. UNION ALL

  10. SELECT 5,74

  11. )

  12. SELECT * INTO Scores FROM t;

  13. SELECT * FROM Scores

结果如下:

1、ROW_NUMBER()

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

1.1 对学生成绩排序

示例

  1. SELECT

  2. ROW_NUMBER() OVER (ORDER BY SCORE DESC) AS [RANK],*

  3. FROM Scores;

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

结果如下:

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

1.2 获取第2名的成绩信息 

  1. SELECT * FROM (

  2. SELECT ROW_NUMBER() OVER (ORDER BY SCORE DESC) AS [RANK],*

  3. FROM Scores

  4. ) 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()则不一样。如果出现相同的,他们的排名是一样的。下面看例子:

示例

  1. SELECT ROW_NUMBER() OVER (ORDER BY SCORE DESC) AS [RANK],*

  2. FROM Scores;

  3. SELECT RANK() OVER (ORDER BY SCORE DESC) AS [RANK],*

  4. 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() 我们看例子:

示例

  1. SELECT

  2. RANK() OVER (ORDER BY SCORE DESC) AS [RANK],*

  3. FROM Scores;

  4. SELECT

  5. DENSE_RANK() OVER (ORDER BY SCORE DESC) AS [RANK],*

  6. 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函数里的参数进行平分分区。

这几兄弟就介绍完了,觉得不错记得帮忙转发分享给更多人

行动吧,在路上总比一直观望的要好,未来的你肯定会感 谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入扣群: 320231853,里面有各种软件测试+开发资料和技术可以一起交流学习哦。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

  • 25
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在HiveSQL,有几个常用排序函数,包括rank、dense_rank和row_number。这些函数可以用来对查询结果进行排序和生成序号。 rank函数是对查询结果进行排名,考虑over子句排序字段值相同的情况。如果使用rank函数来生成序号,over子句排序字段值相同的序号是一样的,后面字段值不相同的序号将跳过相同的排名号排下一个。rank函数的使用方法与row_number函数完全相同。例如,可以使用以下语句在HiveSQL使用rank函数来生成序号: ``` SELECT RANK() OVER (ORDER BY column_name) AS rank, * FROM table_name; ``` dense_rank函数与rank函数类似,但在生成序号时是连续的。当出现相同排名时,dense_rank函数不会跳过相同排名号,而是紧接上一次的rank值。在各个分组内,rank()是跳跃排序,有两个第一名时接下来就是第四名,dense_rank()是连续排序,有两个第一名时仍然跟着第二名。可以使用以下语句在HiveSQL使用dense_rank函数来生成序号: ``` SELECT DENSE_RANK() OVER (ORDER BY column_name) AS dense_rank, * FROM table_name; ``` row_number函数是最简单的排序函数,它为每一行生成一个唯一的序号,不考虑排序字段值相同的情况。可以使用以下语句在HiveSQL使用row_number函数来生成序号: ``` SELECT ROW_NUMBER() OVER (ORDER BY column_name) AS row_number, * FROM table_name; ``` 以上是HiveSQL常用排序函数的用法。根据具体的需求,可以选择合适的函数来生成序号。 #### 引用[.reference_title] - *1* *2* [【数据库】HIVE SQL几种排序函数(ROW_NUMBER&RANK&DENSE_RANK)](https://blog.csdn.net/Jarry_cm/article/details/81904294)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [数据分析EPHS(11)-详解Hive排序函数](https://blog.csdn.net/abcdefg90876/article/details/105085553)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值