【SQL Server】SQL Server中的DENSE_RANK()

一、DENSE_RANK()

在SQL Server中,可以使用`DENSE_RANK() `函数与`OVER`子句一起使用来为结果集中的行分配一个密集的排名。一般的语法如下:

DENSE_RANK() OVER (PARTITION BY \<列名\> ORDER BY \<列名\>)

下面是一个示例,演示如何在SQL Server中使用`DENSE_RANK()`函数:

sql 复制代码
SELECT columnA ,columnB  
    ,DENSE_RANK() OVER (ORDER BY columnB DESC) AS DENSE_RANK
FROM Sales;
  • 在示例中,`DENSE_RANK()`函数为`columnB`列中的值分配了一个密集的排名,并将结果作为`Rank`列返回。

二、PARTITION BY子句

如果要按照特定的列进行分组,并在每个分组内使用`DENSE_RANK()`函数,可以使用`PARTITION BY`子句:

sql 复制代码
SELECT columnA ,columnB ,columnC
    ,DENSE_RANK() OVER (PARTITION BY columnA ORDER BY columnC DESC) AS DENSE_RANK
FROM Sales;

在这个示例中,`DENSE_RANK()`函数将根据`columnA`列分组,并为每个分组内的`columnC`列的值分配一个密集的排名。

三、排名窗口函数

  • ROW_NUMBER():为结果集中的每一行分配一个唯一的连续数字,通常用于分页查询
  • RANK():为结果集中的每一行分配一个排名,相同值的行会有相同的排名,排名之间会有间隔。
  • DENSE_RANK():与RANK()类似,但排名之间不会有间隔,即相同值的行会有相同的排名,并且排名是连续的。

四、DENSE_RANK() 与 RANK() 的区别

函数 相同值排名 排名间隔
RANK() 相同 有间隔(如 1, 1, 3)
DENSE_RANK() 相同 无间隔(如 1, 1, 2)

五、实例

sql 复制代码
WITH
SalesData AS (
	SELECT N'华东区' AS [部门] ,N'张三' AS [销售员] ,50000 AS [营业额] UNION ALL
	SELECT N'华东区' AS [部门] ,N'李四' AS [销售员] ,50000 AS [营业额] UNION ALL
	SELECT N'华东区' AS [部门] ,N'王五' AS [销售员] ,45000 AS [营业额] UNION ALL
	SELECT N'华北区' AS [部门] ,N'赵六' AS [销售员] ,60000 AS [营业额] UNION ALL
	SELECT N'华北区' AS [部门] ,N'孙七' AS [销售员] ,55000 AS [营业额] UNION ALL
	SELECT N'华北区' AS [部门] ,N'周八' AS [销售员] ,55000 AS [营业额] UNION ALL
	SELECT N'华南区' AS [部门] ,N'吴九' AS [销售员] ,48000 AS [营业额] UNION ALL
	SELECT N'华南区' AS [部门] ,N'郑十' AS [销售员] ,48000 AS [营业额] UNION ALL
	SELECT N'华南区' AS [部门] ,N'钱十一' AS [销售员] ,42000 AS [营业额] UNION ALL
	SELECT N'华南区' AS [部门] ,N'陈十二' AS [销售员] ,40000 AS [营业额] 
)
SELECT [部门] ,[销售员] , [营业额] 
	,DENSE_RANK() OVER (ORDER BY [营业额] DESC) AS DENSE_RANK_全局排名
	,DENSE_RANK() OVER (PARTITION BY [部门] ORDER BY [营业额] DESC) AS DENSE_RANK_部门内排名
	,ROW_NUMBER() OVER (ORDER BY [营业额] DESC) AS ROW_NUMBER_全局排名
	,ROW_NUMBER() OVER (PARTITION BY [部门] ORDER BY [营业额] DESC) AS ROW_NUMBER_部门内排名
FROM SalesData;
相关推荐
无奈笑天下3 小时前
银河麒麟上lsblk命令教程详解
linux·运维·服务器·数据库
xiaoye-duck4 小时前
《C++ 项目:手写大模型接入 SDK》会话模块整合:内存 SessionManager 与 DataManager 持久化联动
开发语言·数据库·c++·语言模型
AllData公司负责人5 小时前
AI大模型数据开发底座系列说明书:AllData集成DB-GPT开源项目建设 AI 多模态分析底座,涵盖模态解析/智能大屏/MCP 扩展!
大数据·数据库·人工智能·gpt·数据采集·数据接入·模态解析
2601_967987375 小时前
Sqlite参考手册
数据库·python·sqlite·api·教程
隔窗听雨眠6 小时前
Oracle日志体系分层结构与故障定位路径
数据库·oracle·故障排查
为思念酝酿的痛6 小时前
C语言操作MySQL
数据库·mysql
ShineWinsu6 小时前
对于Qt:QTabWidget常见属性的解析
开发语言·数据库·c++·qt·浏览器·qtabwidget·标签页
星恒随风17 小时前
MySQL 从零入门(五):MySQL 内置函数详解——日期、字符串、数学函数与实战案例
linux·数据库·笔记·sql·mysql
吴名氏.19 小时前
Java转AI Agent教程(第十三周)混合检索与重排
java·数据库·人工智能·ai·ai agent
爱码少年19 小时前
Springboot下如何将CSV文件数据导入H2、Mysql数据库表
数据库·mysql·csv