如何在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
相关产品推荐
相关产品推荐

