MySQL去重规则怎么实现

一个表,里面有部分数据重复。现在有三个字段abc,如果a的两行相等,则保留 b值最大的。如果ab均相等,则保留C值最大的。请问怎么实现?

用group by,sql参考如下:

select a, case when max_b=min_b then max_c else max_b end max
from 
(select a, max(b) max_b, min(b) min_b from table group by a) t1 left join
(select a,b,max(c) max_c from table group by a,b) t2
on t1.a=t2.a and t1.max_b=t2.b

子查询t1:根据a分组,找最大b值和最小b值
子查询t2:根据a,b分组,找最大c值
t1 left join t2 on t1.a=t2.a and t1.max_b=t2.b:将具有最大b值和最大c值的记录连起来
case when max_b=min_b then max_c else max_b end:如果最大b值和最小b值相等,取最大c值,否则取最大b值

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
可以使用 GROUP BY + MAX() 函数来实现按照一定规则去重的操作。
具体来说,可以按照 a 字段分组,对于每组数据,选择 b 字段最大的一条记录,如果 b 相等,则选择 c 字段最大的一条记录。可以用如下 SQL 语句实现:

SELECT a, MAX(b) AS b, MAX(c) AS c
FROM table_name
GROUP BY a;

其中,table_name 是你要去重的表名,abc 分别是你要去重的字段。上述 SQL 语句中,首先按照 a 字段进行分组,然后对于每组数据,使用 MAX() 函数选择 b 和 c 字段的最大值,从而得到去重后的结果。

如果你需要在去重后将结果保存到一张新表中,可以使用 INSERT INTO SELECT 语句,例如:

CREATE TABLE new_table_name (
  a INT,
  b INT,
  c INT,
  PRIMARY KEY (a)
);

INSERT INTO new_table_name (a, b, c)
SELECT a, MAX(b) AS b, MAX(c) AS c
FROM table_name
GROUP BY a;

在上述 SQL 语句中,首先创建一张新表 new_table_name,然后使用 INSERT INTO SELECT 语句将去重后的结果插入到新表中。需要注意的是,新表的主键应该是去重的字段,以便于后续查询和操作。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/761817
  • 这篇博客你也可以参考下:当mysql联合索引abc遇到“比较运算符”会怎样?
  • 除此之外, 这篇博客: MySQL联合索引(abc)命中规则中的 2.测试 联合索引(a,b,c) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 使用 ‘EXPLAIN’ sql语句查看执行详情

    EXPLAIN SELECT * FROM test_models WHERE a = 100 AND b = 1000 AND c = 10000;
    

    在这里插入图片描述

  • 以下回答由chatgpt基于相关博客总结生成:

    我可以提供具体的解决方案。可以使用MySQL的GROUP BY和MAX函数来实现这个去重规则。

    首先,根据a字段进行分组,然后使用MAX函数获取每个分组中b的最大值和c的最大值。这样就可以得到去重后的数据。

    具体步骤如下:

    1. 创建一个包含a、b、c三个字段的表,例如名为my_table。

    2. 使用下列SQL语句来进行数据去重操作:

    SELECT a, MAX(b), MAX(c)
    FROM my_table
    GROUP BY a;
    

    这条语句将查询出去重后的数据,其中每个a所对应的b的最大值和c的最大值。如果两个a的值相等,则选择b值最大的那一行;如果a和b都相等,则选择c值最大的那一行。

    注意:为了确保正确性,需要对b和c的数据类型进行约束,例如可以将它们设置为数字类型,这样才能进行MAX运算。

    以上就是使用MySQL实现去重规则的具体步骤。