【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;
相关推荐
dfdfadffa2 小时前
如何用模块化方案组织一个可扩展的前端组件库项目
jvm·数据库·python
2301_812539672 小时前
SQL中如何高效实现分组数据的批量更新_利用窗口函数与JOIN
jvm·数据库·python
2501_901200532 小时前
如何实现SQL存储过程存储过程参数标准化_统一命名规范
jvm·数据库·python
运气好好的3 小时前
Golang怎么用embed嵌入SQL文件_Golang如何将SQL迁移文件嵌入Go程序统一管理【技巧】
jvm·数据库·python
念何架构之路3 小时前
MySql常见ORM
数据库·mysql
xcLeigh4 小时前
KES数据库安全、权限、审计实战
数据库·安全·备份·权限·审计·ssl加密·密码策略
zjy277774 小时前
c++如何实现日志文件的异步落盘功能_基于无锁队列方案【附代码】
jvm·数据库·python
河阿里4 小时前
SQL:深分页问题深度解析
数据库·sql
wang3zc4 小时前
JavaScript中函数声明位置对解析器预编译的影响
jvm·数据库·python
涤生大数据4 小时前
AI时代,SQL该何去何从?
数据库·人工智能·sql