【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;
相关推荐
ccddsdsdfsdf6 小时前
DBeaver怎么链接mongoDB
数据库·mongodb
丷丩7 小时前
Postgresql基础实践教程(十一)各种Join
数据库·postgresql·join
星夜夏空997 小时前
FreeRTOS学习(4)——内存映射
数据库·学习·mongodb
TheRouter8 小时前
AI Agent 记忆体系建设实战:短期、长期与工作记忆的工程实现
数据库·人工智能·oracle
Omics Pro8 小时前
首个!外源天然产物综合性代谢图谱
数据库·人工智能·算法·机器学习·r语言
唐青枫8 小时前
MySQL EXISTS 详解:存在性判断、NOT EXISTS 与实战示例
sql·mysql
JAVA面经实录9179 小时前
Hibernate面试题库
数据库·oracle·hibernate
迷枫71210 小时前
DM8 目录结构与常用排查入口梳理
服务器·数据库
Mr.Daozhi11 小时前
RAG 进阶实战:跑通 Demo 后我连续翻了 6 次车,逐一修复才真正可用(含 Gradio Web 版)
前端·数据库·langchain·大模型·gradio·rag·科研工具
小程故事多_8011 小时前
Claude Code自定义workflow skills用法
数据库·人工智能·智能体