【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;
相关推荐
troy1287 小时前
向量数据库选型指南:Milvus / Qdrant / Chroma / pgvector
数据库·milvus
彧azz8 小时前
Redis 全面指南:从核心概念到高可用架构实战
数据库·redis·架构
DBA小马哥9 小时前
MongoDB 数据同步怎么做?oplog、Change Streams、同步工具 4 种方案一次讲清(附踩坑清单)
数据库·mongodb
香菜TTT10 小时前
Redis的哨兵机制
java·数据库·redis
风哥2号11 小时前
数据库教程FGMT13‑Oracle性能优化之数据仓库与分区表
数据库·oracle·性能优化
玉宇夕落11 小时前
Docker + Milvus,数据库永久存放记忆,让对话历史永不丢失
数据库·docker·llm
子非鱼a11 小时前
【WEB】[GXYCTF2019]BabySQli
sql
Zenova EdgeOS12 小时前
工业网关数据持久化:从同步到 WAL 的工程实战
网络·数据库·oracle
企查查数据服务12 小时前
全军禁入下客商准入风控,关联图谱与穿透核查
大数据·开发语言·数据库·php