mysql - 如何在 MySQL Query 中过滤少量重复
问题描述
我有一个如下所示的 mysql 表。它用于存储带有版本控制的文档。
我想选择一个最新的docid(具有最高的主要版本和次要版本)。它将消除所有相同的文档 ID,仅获取具有最高 major_version 和 minor_version 的文档。所以我想要结果如下。
解决方案
在 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)
)
)
推荐阅读
- azure - Luis 端点在发布时显示不同的结果
- c++ - 如何将 Char** 推入 uin8_t 向量?
- c - 为什么 sigaction 调用核心转储
- xamarin - Xamarin:InitializeComponent() 太复杂
- python - 在包含所有依赖项的 ac 程序中嵌入 python
- javascript - 为什么用户在删除后无法选择图像?
- javascript - 基于屏幕尺寸的功能
- angular - 使用承诺删除后如何刷新我的列表
- c# - 这是我应该编码我的游戏以在玩家死亡后重置分数的正确方式吗?
- tensorflow - 在 Keras/Tensorflow 中延迟梯度更新