【问题标题】:Filtering out duplicate data based on more than one value in MySQL 8在 MySQL 8 中根据多个值过滤掉重复数据
【发布时间】:2019-12-10 02:11:08
【问题描述】:

我有一个像这样的简单表

+----+---------------------+
| id |      datetime       |
+----+---------------------+
|  1 | 2019-05-05 16:00:00 |
|  1 | 2019-05-05 17:00:00 |
|  1 | 2019-05-05 18:00:00 |
|  1 | 2019-05-05 18:00:00 |
|  2 | 2019-05-05 16:00:00 |
|  2 | 2019-05-05 17:00:00 |
|  2 | 2019-05-05 18:00:00 |
|  3 | 2019-05-05 17:00:00 |
|  3 | 2019-05-05 17:00:00 |
+----+---------------------+

我想过滤掉所有具有重复 datetime 条目的行 每个 id,这样我最终可能会得到这样的表格:

+----+---------------------+
| id |      datetime       |
+----+---------------------+
|  1 | 2019-05-05 16:00:00 |
|  1 | 2019-05-05 17:00:00 |
|  1 | 2019-05-05 18:00:00 |
|  2 | 2019-05-05 16:00:00 |
|  2 | 2019-05-05 17:00:00 |
|  2 | 2019-05-05 18:00:00 |
|  3 | 2019-05-05 17:00:00 |
+----+---------------------+

在 MySQL 中最简单的方法是什么?

编辑:假设我有另一个名为weight 的列,它为每行数据分配一个数字权重。有没有办法告诉 MySQL 根据哪个具有最大的 weight 来过滤掉每个 id 的重复 datetime 条目?

【问题讨论】:

  • 如果没有某种机制来唯一标识行,就没有真正的表格。
  • 如果您有不同的问题,请提出不同的问题(如果合适,请参考此问题)
  • 像@Strawberry 或多或少说没有办法编写一个 SQL 来始终授予 100% 确定性(固定)结果,而无需唯一标识列,该列需要具有主键或唯一键。
  • 我们可以假设该列存在,我只是使用一个骨架表来大致了解我需要做什么

标签: mysql sql database duplicates distinct


【解决方案1】:

使用不同的

   select distinct id,datetime from table_name

编辑后,您似乎需要row_number()

 select * from 
  (select *,
  row_number() over(partition by id,datetime order by weight desc) rn
  from table_name
  ) a where a.rn=1

【讨论】:

  • 这个查询是错误的,看看预期的结果,它接缝是每组“最后一个”唯一的 3 条记录限制.. 另请参阅问题下的我的评论..
  • 示例/预期数据在编辑中没有改变。编辑也是一个“新”问题..
【解决方案2】:

你似乎想要:

select t.*
from t
where t.weight = (select max(t2.weight)
                  from t t2
                  where t2.id = t.id and t2.datetime = t.datetime
                 );

【讨论】:

    猜你喜欢
    • 2019-09-09
    • 1970-01-01
    • 2019-01-12
    • 2021-10-25
    • 2017-03-13
    • 2021-04-21
    • 1970-01-01
    • 2013-01-10
    相关资源
    最近更新 更多