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

如何在SQL中按姓名和类别保留单个分数其余置零?

能否用SQL实现指定的Score值保留需求?

原始表数据

Name  Category  Subject  Score
Alice 1         Math     2
Alice 1         Biology  3
Bob   2         Math     4
Bob   2         Biology  2

需求说明

按**姓名(Name)+类别(Category)**分组,每组仅保留一条记录的Score值,其余记录的Score设为0,期望输出结果如下:

Name  Category  Subject  Score
Alice 1         Math     2
Alice 1         Biology  0
Bob   2         Math     4
Bob   2         Biology  0

实现方案

完全可以用SQL实现,下面提供两种常用方法:

方法一:窗口函数(推荐,简洁高效)

利用ROW_NUMBER()窗口函数给每组内的记录编号,再通过CASE语句判断是否保留原Score:

SELECT 
    Name,
    Category,
    Subject,
    CASE 
        WHEN ROW_NUMBER() OVER(PARTITION BY Name, Category ORDER BY Subject) = 1 
        THEN Score 
        ELSE 0 
    END AS Score
FROM your_table_name;
  • PARTITION BY Name, Category:按姓名和类别进行分组
  • ORDER BY Subject:给组内记录排序(这里按Subject升序,你也可以改成ORDER BY Score DESC,这样保留每组分数最高的那条记录)
  • ROW_NUMBER():给每组内的记录从1开始依次编号,编号为1的行保留原Score,其余行Score设为0

方法二:关联子查询(兼容老版本SQL方言)

如果你的数据库不支持窗口函数,也可以用子查询找到每组要保留的那条记录:

SELECT 
    t1.Name,
    t1.Category,
    t1.Subject,
    CASE 
        WHEN t1.Subject = (SELECT MIN(t2.Subject) FROM your_table_name t2 WHERE t2.Name = t1.Name AND t2.Category = t1.Category)
        THEN t1.Score 
        ELSE 0 
    END AS Score
FROM your_table_name t1;

这里通过子查询找到每组内Subject最小的记录,保留它的Score,其余记录Score置0,逻辑和窗口函数版本一致,可根据实际需求调整子查询的判断条件(比如换成MAX(Score)来保留最高分)。

内容的提问来源于stack exchange,提问作者Lucas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 17:10:23