MySQL如何基于自定义优先级为每个类别分组的行指定最高优先级值
有更简便的实现方案,无需创建临时表、无需手动做权重值替换,以下是两种常用场景的实现:
方案1:MySQL 8.0+ 直接查询结果
借助MySQL内置的FIELD()函数自定义排序规则,搭配FIRST_VALUE()窗口函数直接取每个分组优先级最高的值,单次查询即可得到结果:
SELECT col1, FIRST_VALUE(col2) OVER ( PARTITION BY col1 ORDER BY FIELD(col2, 'Y', 'N', 'NA') ) AS col2 FROM 你的表名;
原理:FIELD(col2, 'Y', 'N', 'NA')会返回值在参数列表中的位置,Y返回1、N返回2、NA返回3,按该值升序排序后,每个col1分组的第一个值就是优先级最高的结果,窗口函数会自动把该值赋值给分组内的所有行。
方案2:兼容MySQL 5.x / 直接更新原表
如果要直接修改原表的值,或者使用的是不支持窗口函数的低版本MySQL,可以用关联更新实现:
UPDATE 你的表名 t1 JOIN ( SELECT col1, col2 AS top_col2 FROM 你的表名 GROUP BY col1 ORDER BY FIELD(col2, 'Y', 'N', 'NA') ) t2 ON t1.col1 = t2.col1 SET t1.col2 = t2.top_col2;
执行后原表的col2就会被批量更新为对应分组的最高优先级值,和你预期的结果完全一致。
内容的提问来源于stack exchange,提问作者user16697126
相关产品推荐
相关产品推荐

