【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;
相关推荐
随风M记忆s26 分钟前
Redis支持事务吗?了解Redis的持久化机制吗?
数据库·redis·bootstrap
花青泽2 小时前
5-数据库-SQL注入-联合查询-关键字绕过-day13
数据库·sql
天桥下的卖艺者8 小时前
使用scitable包,两步生成逆概率删失权重(IPCW)
数据库·r语言
隔窗听雨眠8 小时前
AI原生数据库浪潮:国产数据库的架构重构与路径之争
数据库
数据库小学妹9 小时前
数据库选型实战:从数据类型到TCO成本,五维决策框架+九款产品横评
数据库·信创·国产数据库·数据库选型·oracle迁移
龙仔7259 小时前
人大金仓 KingbaseES V8 只读账号创建完整运维笔记
运维·笔记·sql·人大金仓
神龙天舞200110 小时前
MySQL 备库为什么会延迟好几个小时
android·数据库·mysql
丙氨酸長鏈11 小时前
Web前端入门第 问:JavaScript 一个简单的 IndexedDB 数据库入门示例
前端·javascript·数据库
独行侠影a12 小时前
APScheduler+Redis 分布式定时任务:解决多实例任务重复执行
数据库·redis·分布式
传说故事12 小时前
数据库中一些常用英文单词含义
数据库·oracle