关于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 下面给个列子: 我想要第二页的数据,每一页3行,效果如图 今日分享结束 能帮朋友解决问题的记得给个关注支持一下,以后将多多分享SQL SERVER 相关知识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