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

结果:
在这里插入图片描述
可以看到,score相同的数据行,排序依旧递增。

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

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

在这里插入图片描述

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

结果
在这里插入图片描述
可以看到,score相同的数据行,排序相同。并且为跳跃排序(五个9后面是14)。

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

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

结果
在这里插入图片描述
可以看到,score相同的数据行,排序相同。但为顺序排序(五个9后面仍是10)。
PS:
dense_rank()函数还有个用处,就是将一组内的数据分为同一个序号,并按组递增排序。这样可以获得groupby的num值,对于只有值,没有ID的数据,比较有用。
例如:按照CNO分组排序

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

结果:
在这里插入图片描述

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

结果
在这里插入图片描述

  • 9
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是这些分析函数SQL的语法和实例: 1. DENSE_RANK函数语法:DENSE_RANK() OVER (ORDER BY column_name) DENSE_RANK函数可以用来计算某一列的密集排名,即相等值的数据行将得到相同的排名,但是排名之间没有间隔。 示例: 假设我们有一个名为“customers”的表,其包含客户名称和订单总数。我们可以使用DENSE_RANK函数来按订单总数对客户进行排名,如下所示: SELECT customer_name, order_total, DENSE_RANK() OVER (ORDER BY order_total DESC) as dense_rank FROM customers; 结果将返回客户名称、订单总数和密集排名,按订单总数降序排序。 2. NTILE函数语法:NTILE(n) OVER (ORDER BY column_name) NTILE函数可以将一列数据分成n个等份,并返回每个数据所在的组号。 示例: 假设我们有一个名为“students”的表,其包含学生姓名和成绩。我们可以使用NTILE函数将学生按成绩分成3组,并返回每个学生所在的组号,如下所示: SELECT student_name, grade, NTILE(3) OVER (ORDER BY grade DESC) as ntile FROM students; 结果将返回学生姓名、成绩和组号,按成绩降序排序并分成3组。 3. RANK函数语法:RANK() OVER (ORDER BY column_name) RANK函数可以用来计算某一列的排名,相等值的数据行将得到相同的排名,并且排名之间会有间隔。 示例: 假设我们有一个名为“employees”的表,其包含员工姓名和销售额。我们可以使用RANK函数来按销售额对员工进行排名,如下所示: SELECT employee_name, sales, RANK() OVER (ORDER BY sales DESC) as rank FROM employees; 结果将返回员工姓名、销售额和排名,按销售额降序排序。 4. ROW_NUMBER函数语法:ROW_NUMBER() OVER (ORDER BY column_name) ROW_NUMBER函数可以用来给每一行数据分配一个唯一的数字标识,不考虑数据是否相等。 示例: 假设我们有一个名为“orders”的表,其包含订单号、客户名称和订单总数。我们可以使用ROW_NUMBER函数来对订单进行编号,并按订单总数降序排序,如下所示: SELECT order_number, customer_name, order_total, ROW_NUMBER() OVER (ORDER BY order_total DESC) as row_number FROM orders; 结果将返回订单号、客户名称、订单总数和行号,按订单总数降序排序并为每个订单分配一个唯一的行号。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值