SQL Server中如何仅保留每组首行原值,其余行置0或空?
在SQL Server中实现分组仅第一条记录保留Fee原值,其余设为0
你可以用SQL Server的窗口函数ROW_NUMBER()来实现这个需求,这是最简洁高效的方法:
SELECT category, -- 仅每组第一条保留原Fee,其余设为0 CASE WHEN ROW_NUMBER() OVER (PARTITION BY category ORDER BY [排序字段]) = 1 THEN fee ELSE 0 END AS fee, -- 保留其他需要的列 col1, col2, col3 FROM 你的表名;
关键部分解释:
PARTITION BY category:把数据按category分组,每组单独生成行号ORDER BY [排序字段]:这里必须指定一个字段来确定每组内的“第一条”记录,比如ID、创建时间这类有明确顺序的字段。如果不需要特定顺序,也可以用ORDER BY (SELECT NULL),但建议用实际排序键保证结果稳定CASE语句:根据行号判断,行号为1的记录保留原始fee值,其余记录的fee设为0
如果需要直接更新原表数据(而非仅查询输出),可以用CTE结合UPDATE语句:
WITH ranked_data AS ( SELECT fee, ROW_NUMBER() OVER (PARTITION BY category ORDER BY [排序字段]) AS rn FROM 你的表名 ) UPDATE ranked_data SET fee = 0 WHERE rn > 1;
内容的提问来源于stack exchange,提问作者Tejas
相关产品推荐
相关产品推荐

