MySQL 5.7下替换同orderid重复total_bill_amount为null的SQL实现
实现方案
首先明确:以下方案默认你定义的「同orderid分组内第一条记录」的排序规则为item_amount升序,和你给出的示例匹配。如果你有其他排序规则(比如按自增主键ID排序),替换对应排序/取值字段即可。
方案1:仅查询时转换输出,不修改原表
用MySQL 5.7支持的用户变量实现,不需要改动原数据:
SELECT orderid, item_amount, total_bill_amount FROM ( SELECT orderid, item_amount, IF(@prev_orderid = orderid, NULL, total_bill_amount) AS total_bill_amount, @prev_orderid := orderid FROM (SELECT * FROM 你的表名 ORDER BY orderid, item_amount ASC) t, (SELECT @prev_orderid := NULL) init_var ) res;
逻辑说明:
- 内层先将全表按orderid、排序规则排序,保证同orderid的记录相邻,第一条在最前面
- 用变量
@prev_orderid记录上一行的orderid,当前行和上一行orderid相同时返回NULL,否则返回原账单金额 - 外层查询去掉不需要的变量赋值列,得到最终结果
方案2:直接更新原表数据,永久修改字段值
如果需要把原表中多余的账单金额改为NULL,用以下语句:
UPDATE 你的表名 t1 LEFT JOIN ( -- 先找出每个orderid分组内的第一条记录 SELECT orderid, MIN(item_amount) AS first_item_val FROM 你的表名 GROUP BY orderid ) t2 ON t1.orderid = t2.orderid AND t1.item_amount = t2.first_item_val -- 不是第一条的记录,账单金额设为NULL SET t1.total_bill_amount = NULL WHERE t2.orderid IS NULL;
注意:如果你的表有自增主键ID,更推荐用MIN(主键ID)作为第一条的判断依据,避免同orderid下item_amount重复导致的判断错误,操作前建议先备份原表数据。
内容的提问来源于stack exchange,提问作者layal
相关产品推荐
相关产品推荐

