首页 > 解决方案 > 如何在 MySQL Query 中过滤少量重复

问题描述

我有一个如下所示的 mysql 表。它用于存储带有版本控制的文档。

在此处输入图像描述

我想选择一个最新的docid(具有最高的主要版本和次要版本)。它将消除所有相同的文档 ID,仅获取具有最高 major_version 和 minor_version 的文档。所以我想要结果如下。

在此处输入图像描述

标签: mysqlsqlgreatest-n-per-group

解决方案


在 MySQL 8.0 中,您可以使用以下内容进行过滤row_number()

select *
from (
    select 
        t.*, 
        row_number() over(partition by id, docid order by major_version, minor_version) rn
    from mytable t
) t
where rn = 1

在早期版本中,您可以使用相关子查询进行过滤。假设您在表中有一个主键,例如 column pk,您可以执行以下操作:

select t.*
from mytable t
where t.pk = (
    select t1.pk
    from mytable t1
    where t1.id = t.id and t1.docid = t.docid
    order by t1.major_version desc, t1.minor_version desc 
    limit 1
)

对于性能,请考虑在(id, docid, major_version, minor_version).

如果没有可用作主键的唯一列,则要复杂一些。一种方法是使用not exists

select t.*
from mytable t
where not exists (
    select 1 
    from mytable t1 
    where 
        t1.id = t.id 
        and t1.docid = t.docid
        and (
            t1.major_version > t.major_version
            or (t1.major_version = t.major_version and t1.minor_version > t.minor_version)
        )
)

推荐阅读