SQL Server 生成序号方法(row_number()、rank()、dense_rank()、ntile())

阅读量:24 2024-11-05 SQL Server 生成序号方法(row_number()、rank()、dense_rank()、ntile()) SQL

知识分享不易,转载请标注来源:http://www.blenderkou.top/contents/13/6367.html
版权申明:欢迎转载,但请注明出处。
一些博文中的参考内容因时间久远找不到来源了没有注明,如果侵权请联系我删除。



SQL Server 生成序号方法:row_number()、rank()、dense_rank()、ntile())

先上结论,三者的区别如下:

  • rank()排序相同时会重复,总数不变,即会出现1、1、3这样的排序结果;

  • dense_rank()排序相同时会重复,总数会减少,即会出现1、1、2这样的排序结果;

  • row_number()排序相同时不会重复,会根据顺序排序;

  • ntile()将搜索出来的数据分组装进桶中,具体装进几个桶,需要通过ntile中的数字进行设置,如果分组不均匀,多出来的部分默认放到前面的组。


具体实例:

表中数据

一、row_number()

(1)row_number() over(order by [列名])

说明:将select查询的数据依次进行排序

SELECT row_number() over(ORDER BY tbl.runoob_id) as num,tbl.* 
FROM runoob_tbl tbl;


结果如下图所示:

(2)row_number() over(partition by [列名])

说明:将数据根据[列名]进行分组,然后进行组内排序,组与组之间互不影响。

SELECT row_number() over( PARTITION by tbl.runoob_author ) as num,tbl.* 
FROM runoob_tbl tbl;

结果如下图所示:

备注:partition by 和 order by 可以联合使用


二、rank()

(1)rank() over(order by [列名])

说明:对数据进行排序,不过如果[列名]存在相同的数据,则它们的排序是一样的,这样后续有可能出现跳跃的序号。


SELECT rank() over(ORDER BY tbl.runoob_author) as num,tbl.* 
FROM runoob_tbl tbl;

结果如下图所示:

三、dense_rank()

(1)dense_rank() over(order by [列名])

说明:对数据进行排序,不过如果[列名]存在相同的数据,则它们的排序是一样的,这样后续有可能出现连续的序号。

SELECT dense_rank() over(ORDER BY tbl.runoob_author) as num,tbl.* 
FROM  runoob_tbl tbl;

结果如下图所示:

四、ntile()

(1)ntile([数字]) over(order by [列名])

说明:将搜索出来的数据装进桶中,具体装进几个桶,需要通过ntile中的数字进行设置。主要用于多线程分批处理数据等情况。

如果分组不均匀,默认增加第一个组的数量。

SELECT ntile(2) over (ORDER BY t.runoob_id),t.* 
FROM runoob_tbl t;

结果如图所示,将结果分为2个桶:

分组不均匀时:

image.pngimage.png


关注.png

扫描二维码,关注我的公众号,第一时间获取文章!


知识分享不易,转载请标注来源:http://www.blenderkou.top/contents/13/6367.html
版权申明:欢迎转载,但请注明出处。
一些博文中的参考内容因时间久远找不到来源了没有注明,如果侵权请联系我删除。

上一篇
SQL Server 查询存储过程\视图\函数等 包含某个关键字

下一篇
sql server 查询存储过程的创建时间 和 最后修改时间