SQL Server中RANK()函数:处理并列排名与自然跳号

RANK()是SQL Server的窗口函数,为结果集中的行生成排名 。当出现相同值时,后续排名会跳过被占用的名次,形成自然间隔。与DENSE_RANK()的关键区别在于是否允许排名值连续

语法:

sql 复制代码
RANK() OVER (
    [PARTITION BY 分组列]
    ORDER BY 排序列 [ASC|DESC]
)
  • PARTITION BY:按指定列分组后分别计算排名

  • ORDER BY:决定排名的排序规则

例子1:基础排名(自然跳号)

sql 复制代码
-- 创建学生成绩表
CREATE TABLE ExamScores (
    Student NVARCHAR(50),
    Score INT
);

INSERT INTO ExamScores VALUES
('张三', 95),
('李四', 88),
('王五', 95),
('赵六', 80);

-- 使用RANK()按分数降序排名
SELECT 
    Student,
    Score,
    RANK() OVER (ORDER BY Score DESC) AS Rank
FROM ExamScores;

结果:

可以看到rank那一列没有"2",因为前边有两个"1",这就是rank函数,会跳过2。

示例2:分组排名(部门内排名)

sql 复制代码
-- 创建销售数据表
CREATE TABLE ProductSales (
    Category NVARCHAR(50),
    Product NVARCHAR(50),
    Sales INT
);

INSERT INTO ProductSales VALUES
('电子产品', '手机', 1200),
('电子产品', '耳机', 800),
('服装', 'T恤', 600),
('服装', '外套', 600);

-- 按商品类别分组,组内按销量排名
SELECT 
    Category,
    Product,
    Sales,
    RANK() OVER (
        PARTITION BY Category
        ORDER BY Sales DESC
    ) AS CategoryRank
FROM ProductSales;

何时使用RANK()?

  • 需要反映自然名次间隔

    例如:奥运会奖牌排名(两个金牌后,下一名是铜牌)

  • 允许并列但保留原始名次逻辑

    例如:考试排名(两人并列第1,下一人直接第3名)

相关推荐
广州灵眸科技有限公司6 小时前
xfce桌面触摸校准:基于灵眸科技EASY-EAl-Orin-Nano
数据库·windows·科技
憧憬成为web高手9 小时前
皮卡丘靶场速通--sql 2
数据库·sql·mybatis
段一凡-华北理工大学9 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
oradh11 小时前
Oracle XTTS实现跨版本迁移和升级(Oracle 11g单库升级至19C RAC集群)
数据库·oracle·11g升级19c·xtts跨版本迁移和升级
z1234567898612 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
程序猿DD12 小时前
一个 API Key,统一调用大模型、生图和联网搜索
数据库·网关
java_logo12 小时前
Docker Compose 部署 ClickHouse:快速搭建高性能列式数据库
数据库·clickhouse·docker·列式数据库·轩辕镜像·高性能数据库·clickhouse部署教程
TlSfoward13 小时前
抓包代理链路下的 TLS 指纹变化分析 TLSFOWARD抓包工具
数据库·爬虫·网络协议·搜索引擎·php
数智化管理手记13 小时前
账龄分析手工统计易遗漏?自动账龄分析工具怎么搭建
大数据·网络·数据库·人工智能·数据挖掘
LabVIEW开发13 小时前
NI Package Manager安装LabVIEW时InternalServerError错误
网络·数据库·labview·labview知识·labview功能·labview程序