【发布时间】:2018-11-13 22:43:44
【问题描述】:
我有一个 SQL 表,其中包含一些我想要删除的重复记录。 移除应同时在 2 个条件下进行:
-
score列下的记录具有相同的值 - 记录发生在 8 小时内。
删除的记录应该是所有匹配记录中日期较旧的记录,因此只有匹配记录中最近的记录才会出现在新的查询结果中。
到目前为止,我只设法创建了一个删除此类重复的代码,前提是记录发生在当月的同一天,因此它缺少跨越的任何记录连续超过 2 天 - 如何解决?
原始数据库如下:
user_id score visited_at visit_id
------- ---------------- ------------------- ----------
22 75.0 2018-05-14 23:39:14 169
22 75.0 2018-05-14 18:36:26 168
22 75.0 2018-05-13 02:04:46 166
2 55.0 2018-05-12 18:38:24 165
22 78.0 2018-05-12 18:14:34 164
22 75.0 2018-05-12 18:45:12 164
22 55.0 2018-05-08 12:36:12 161
部分删除重复的 SQL 命令:
SELECT COUNT(*) AS ct
, it.user_id
, it.score
, UNIX_TIMESTAMP(CONVERT_TZ(it.visited_at,'+00:00',@@global.time_zone)) DIV 86400 AS diff
, it.visited_at
, it.visit_id
FROM `vw_items` it
GROUP
BY user_id
, score
, diff
ORDER
BY visited_at DESC
结果:
ct user_id score diff visited_at visit_id
------ ------- ---------------- ------ ------------------- ----------
2 22 75.0 17665 2018-05-14 23:39:14 169
1 22 75.0 17664 2018-05-13 02:04:46 166
1 2 55.0 17663 2018-05-12 18:38:24 165
1 22 78.0 17663 2018-05-12 18:14:34 164
1 22 75.0 17663 2018-05-12 18:45:12 164
1 22 55.0 17659 2018-05-08 12:36:12 161
但我需要一个同时删除记录的命令:
1 22 75.0 17663 2018-05-12 18:45:12 164
因为它与另一个记录具有相同的分数,即更新的记录,发生在该记录的 8 小时内:
1 22 75.0 17664 2018-05-13 02:04:46 166
【问题讨论】:
-
是否会在同一天排一排,但要提前 9 小时保留?
-
是的,这样的行不应该被删除
-
应该保留当天的最大值吗?如果同一天有多行,8 小时时间段有多个重叠,您如何确定要保留哪些?例如,如果您在上午 8 点、上午 10 点、中午 12 点、下午 2 点、下午 4 点和晚上 8 点有行,将保留哪些行(假设分数相同)行将消除上午 10 点行。
-
是的,在这种情况下,除了晚上 8 点,所有东西都应该被淘汰
标签: mysql sql database select count