SQL中常用的窗口函数(排序函数)-row_number/rank/dense_rank/ntile

这篇具有很好参考价值的文章主要介绍了SQL中常用的窗口函数(排序函数)-row_number/rank/dense_rank/ntile。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

总结四个函数的特点:
row_number():连续不重复;1234567
rank() :重复不连续;1222567
dense_rank():重复且连续;1222345
ntile():平均分组;1122334

一、函数介绍

SQL Server中的排序函数有四个:row_number(),rank(),dense_rank()及ntile()函数;

1.row_number()函数

特点: row_number()函数可以为每条记录添加递增的顺序数值序号,即使值完全相同也依次递增序号,不会重复。

语法:

ROW_NUMBER() OVER (
    [PARTITION BY partition_expression, ... ]
    ORDER BY sort_expression [ASC | DESC], ...
)

PARTITION BY子句将结果集划分为分区。 ROW_NUMBER()函数分别应用于每个分区,并重新初始化每个分区的行号。PARTITION BY子句是可选的。如果未指定,ROW_NUMBER()函数会将整个结果集视为单个分区。
ORDER BY子句定义结果集的每个分区中的行的逻辑顺序。 ORDER BY子句是必需的,因为ROW_NUMBER()函数对顺序敏感。

2.rank()函数

特点: rank()函数也是返回每条记录的排名序号,但当值相同时,序号也将相同,同时跳跃排序(比如两个第一名后面是第三名)。

语法:

RANK() OVER (
    [PARTITION BY partition_expression, ... ]
    ORDER BY sort_expression [ASC | DESC], ...
)

PARTITION BY子句划分应用该函数的结果集分区的行。
ORDER BY子句指定应用该函数每个分区中行的逻辑排序顺序。

3.dense_rank()函数

特点: dense_rank()函数进行排序时,也会将值相同的数据赋予同一个序号,但与rank()函数不同的是,dense_rank()函数为连续排序(比如两个第一名后面是第二名)。

语法:

DENSE_RANK() OVER (
    [PARTITION BY partition_expression, ... ]
    ORDER BY sort_expression [ASC | DESC], ...
)

dense_rank()函数以ORDER BY子句定义的指定顺序应用于PARTITION BY子句定义的每个分区的行。它会在划分分区边界时重置等级。
PARITION BY子句是可选的。如果省略它,该函数会将整个结果集视为单个分区。

4.ntile(n)函数

特点: ntile(n)函数会将数据分为n组,自动进行分组 (每组数量大致相等,若无法均分为n组,则每组的记录数不能大于它上一组的记录数),每组将会分配同一个序号(组号为1-n)。

语法:

NTILE(integer_expression) OVER (
    [PARTITION BY partition_expression, ... ]
    ORDER BY sort_expression [ASC | DESC], ...
)

integer_expression 为数据行划分的组数。
PARTITION BY子句将结果集的行分配到应用了NTILE()函数的分区中。
ORDER BY子句指定应用NTILE()的每个分区中行的逻辑顺序。

二、 应用实例

  • row_number()函数
    将所有数据按照score排名
select row_number()over(order by SCORE) as num,sc.* from sc

结果:
SQL中常用的窗口函数(排序函数)-row_number/rank/dense_rank/ntile
可以看到,score相同的数据行,排序依旧递增。

另外,可以使用partition by为数据进行分组排序
例如,按照CNO分组,将score排序

select row_number()over(partition by CNO order by SCORE) as num,sc.* from sc

SQL中常用的窗口函数(排序函数)-row_number/rank/dense_rank/ntile

  • rank()函数
    将所有数据按照score排名
select rank()over(order by SCORE) as num,sc.* from sc

结果
SQL中常用的窗口函数(排序函数)-row_number/rank/dense_rank/ntile
可以看到,score相同的数据行,排序相同。并且为跳跃排序(五个9后面是14)。

partition by使用方法相同,不再模拟。

  • dense_rank()函数
    将所有数据按照score排名
select dense_rank()over(order by SCORE) as num,sc.* from sc

结果
SQL中常用的窗口函数(排序函数)-row_number/rank/dense_rank/ntile
可以看到,score相同的数据行,排序相同。但为顺序排序(五个9后面仍是10)。
PS:
dense_rank()函数还有个用处,就是将一组内的数据分为同一个序号,并按组递增排序。这样可以获得groupby的num值,对于只有值,没有ID的数据,比较有用。
例如:按照CNO分组排序

select dense_rank()over(order by CNO ) as num,sc.* from sc

结果:
SQL中常用的窗口函数(排序函数)-row_number/rank/dense_rank/ntile

  • ntile()函数
    将所有数据按照score排序,并分为4组
select ntile(4)over(order by SCORE ) as num,sc.* from sc

结果
SQL中常用的窗口函数(排序函数)-row_number/rank/dense_rank/ntile文章来源地址https://www.toymoban.com/news/detail-448575.html

到了这里,关于SQL中常用的窗口函数(排序函数)-row_number/rank/dense_rank/ntile的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ROW_NUMBER()、RANK()、DENSE_RANK区别

    ROW_NUMBER()、RANK()、DENSE_RANK区别 ROW_NUMBER() :排序,不会有重复的排序数值。对于相等的两个数字,排序序号不一致 数值 排序序号 1 1 1 2 2 3 DENSE_RANK() :排序,可有重复值。对于相等的两个数字,排序序号一致 数值 排序序号 1 1 1 1 2 2 RANK() :排序,可有重复值。对于相等的两

    2024年02月11日
    浏览(31)
  • 【hive】hive中row_number() rank() dense_rank()的用法

    主要是配合over()窗口函数来使用的,通过over(partition by order by )来反映统计值的记录。 rank() over()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内) dense_rank() over()是连续排序,有两个第二名时仍然跟着第三名。相比之下 row_number是没有重复值的 row_number() 会

    2024年02月12日
    浏览(29)
  • mysql之row_number函数

    1.语法 #将字段按照COLUMN1分组COLUMN2排序后分配一个从1开始升序的编号 PARTITION BY子句将结果集划分为分区。 ROW_NUMBER()函数分别应用于每个分区,并重新初始化每个分区的行号。 PARTITION BY子句是可选的。如果未指定,ROW_NUMBER()函数会将整个结果集视为单个分区。 ORDER BY子句定义

    2024年02月03日
    浏览(35)
  • MySQL 实现row_number() over(partition by ) 分组排序功能

    语法格式:   row_number() over()分组排序功能: 在使用 row_number() over()函数时候,over()里头的分组以及排序的执行晚于 where 、group by,但不晚于 order by 的执行。   创建测试环境 在线数据库 http://sqlfiddle.com/   1. 创建表   2. Oracle row_number() over(partition by) 分组排序功能   3. M

    2024年02月15日
    浏览(40)
  • row_number 和 cte 使用实例:按照队列进行数据抵消

    今天无聊的翻了翻以前的论坛的帖子。。。嗯,想把一些没有什么价值的消息记录给删除掉,就是那些专家分获取记录。 毕竟,现在论坛已经改名叫社区了,也取消了专家分这个设置了。 在进行记录删除前,老顾觉得,有些比较有意思的问题,还是把记录保留下来,比在所

    2024年02月16日
    浏览(35)
  • hive limit分页查询、row_number()分页查询

       hive执行limit语句报错,分页失败 如: 2.1 row_number()的使用   (1)按照deptno分组,不排序   (2)按照empno进行排序,不分组,排序列命名rownum   (3)按照empno排序,同时根据deptno进行分组 2.2 分页   从原表中查询第6到第10行数据 注:   row_number最好写一个 临时

    2023年04月08日
    浏览(40)
  • GaussDB(DWS)迁移实践丨row_number输出结果不一致

    摘要: 迁移前后结果集row_number字段值前后不一致,前在DWS上运行不一致。 本文分享自华为云社区《GaussDB(DWS)迁移 - oracle兼容 --row_number输出结果不一致》,作者:譡里个檔 。 迁移前后结果集row_number字段值前后不一致,前在DWS上运行不一致。 这种问题大部分都是因为PARTITI

    2024年02月06日
    浏览(65)
  • mysql8之前如何实现row_number() over(partition by xxx order by xxx asc/desc)

    最近笔者在进行对广告业务的数据统计时遇到这种情况,业务方嫌弃离线数仓太慢,又无需太高的实时性本该使用即席查询的OLAP去做,但是当前公司调研的OLAP还没有推到广告业务侧,无奈只得使用mysql暂时顶一下。我们当前使用的是mysql5.7。 一充用户 :当日只有一次充值的

    2024年02月05日
    浏览(56)
  • Hive的Rank排名(rank函数,dense_rank函数,row_numer函数)

    一、区别: 三者通常都会配合窗口函数over(),并结合partition by order by xxx来分组排序,即形式使用:function_name over(partition by xxx order by xxx)。首先三者都是产生一个自增序列,不同的是 row_number( ) 排序的字段值相同时序列号不会重复,如:1、2、(2)3、4、5(出现两个2,第二个

    2023年04月17日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包