关于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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构