You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:31:21