Fork me on GitHub

关于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;
View Code

可以先自己允许看看,

下面上效果图:

 

 

 可见,采用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 相关知识

posted @ 2022-06-17 18:33  酒笙匿清栀  阅读(213)  评论(0编辑  收藏  举报