关于SQL SERVER ROW_NUMBER(),RANK(),DENSE_RANK() 的排序和分页查询问题
经常接触SQL SERVER 的朋友来说,排序是经常遇见的问题,有的人还会傻傻自己写排序,比如用循环去写,当然这就比较难受
今天就给大家介绍一下SQL SERVER 自带的排序,共有三种,分别为ROW_NUMBER(),RANK(),DENSE_RANK() ,直接先给大家看列子再解释:
先上代码:
DECLARE @t1 TABLE ( id INT, name NVARCHAR(10) ); INSERT @t1 ( id, name ) VALUES (1, N'1'), (1, N'2'), (2, N'1'), (3, N'1'), (4, N'1'), (4, N'2'), (4, N'3'), (6, N'1'), (9, N'1'); SELECT ROW_NUMBER() OVER (ORDER BY id ASC) 'ROW_NUMBER', RANK() OVER (ORDER BY id ASC) 'RANK', DENSE_RANK() OVER (ORDER BY id ASC) 'DENSE_RANK', id, name FROM @t1;
可以先自己允许看看,
下面上效果图:
可见,采用ROW_NUMBER()排序,排序是所有数据排序,最大序号为数据的行总数,
采用 RANK()排序,最大序号也为数据的行总数,但是跳过了相同的,简而言之就是序号不连续;
采用DENSE_RANK()排序,则是序号连续,但是有并列。
使用场景一般是在做分页的时候用,比如查多少页,每一页多少行,则可以用 (Page-1)*Rows<row<Page*Rows
下面给个列子:
DECLARE @t1 TABLE ( id INT, name NVARCHAR(10) ); INSERT @t1 ( id, name ) VALUES (1, N'1'), (1, N'2'), (2, N'1'), (3, N'1'), (4, N'1'), (4, N'2'), (4, N'3'), (6, N'1'), (9, N'1'); --SELECT ROW_NUMBER() OVER (ORDER BY id ASC) 'ROW_NUMBER', -- RANK() OVER (ORDER BY id ASC) 'RANK', -- DENSE_RANK() OVER (ORDER BY id ASC) 'DENSE_RANK', -- id, -- name --FROM @t1; DECLARE @Page INT=2 DECLARE @Rows INT=3 SELECT * FROM ( SELECT ROW_NUMBER() OVER (ORDER BY id ASC) row,id,name FROM @t1)t WHERE (@Page-1)*@Rows<t.row AND t.row<=@Page*@Rows
我想要第二页的数据,每一页3行,效果如图
今日分享结束
能帮朋友解决问题的记得给个关注支持一下,以后将多多分享SQL SERVER 相关知识
本文来自博客园,作者:酒笙匿清栀,转载请注明原文链接:https://www.cnblogs.com/libo962464/p/16386789.html