SQL Server:如何按Id分组返回单条最大尺寸的行
嘿,这个需求我经常碰到,给你几个适配不同数据库的解决方案,直接就能用:
核心思路
首先得给你的尺寸字符串定义一个优先级排序(毕竟字符串默认排序可能不符合我们对“尺寸大小”的认知,比如x-large默认字符串排序会在large前面,但如果是按实际尺寸逻辑,可能需要调整),然后按Id分组,取出每组中优先级最高的那一行。
1. MySQL 实现方案
用窗口函数ROW_NUMBER()来给每个分组内的行排序,然后筛选出排名第一的行:
SELECT Id, Size, -- 这里替换成你需要的其他字段 其他字段名1, 其他字段名2 FROM ( SELECT *, -- 按尺寸优先级倒序排序,最大的排第一 ROW_NUMBER() OVER ( PARTITION BY Id ORDER BY CASE Size WHEN 'small' THEN 1 WHEN 'medium' THEN 2 WHEN 'large' THEN 3 WHEN 'x-large' THEN 4 WHEN 'xx-large' THEN 5 -- 把你所有的尺寸类型都加在这里,按从小到大的顺序赋值 END DESC ) AS row_rank FROM 你的表名 -- 替换成你的实际表名 ) ranked_data WHERE row_rank = 1;
2. PostgreSQL 实现方案
思路和MySQL一致,窗口函数语法通用,也可以用这个写法:
SELECT Id, Size, 其他需要的字段 FROM ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY Id ORDER BY CASE Size WHEN 'small' THEN 1 WHEN 'medium' THEN 2 WHEN 'large' THEN 3 WHEN 'x-large' THEN 4 -- 补充所有尺寸类型 END DESC ) AS row_rank FROM 你的表名 ) ranked_data WHERE row_rank = 1;
如果你用PostgreSQL且尺寸是固定的,也可以先创建一个枚举类型(比如CREATE TYPE size_enum AS ENUM ('small', 'medium', 'large', 'x-large');),这样排序时直接用Size DESC就行,不用写CASE WHEN。
3. SQL Server 实现方案
同样适用窗口函数,写法几乎一样:
SELECT Id, Size, 其他字段 FROM ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY Id ORDER BY CASE Size WHEN 'small' THEN 1 WHEN 'medium' THEN 2 WHEN 'large' THEN 3 WHEN 'x-large' THEN 4 -- 加入所有尺寸类型 END DESC ) AS row_rank FROM 你的表名 ) ranked_data WHERE row_rank = 1;
额外注意点
- 一定要把所有的尺寸类型都加到CASE WHEN里,否则未匹配到的尺寸会被默认赋值为
NULL,在倒序排序时会排在最后,可能不是你想要的结果。 - 如果同一个
Id下有多个行是相同的最大尺寸,ROW_NUMBER()会随机返回其中一行;如果想要返回所有这些行,把ROW_NUMBER()换成RANK()或者DENSE_RANK()即可。
内容的提问来源于stack exchange,提问作者Lester
相关产品推荐
相关产品推荐

