我有一个sql表,其中包含一些要删除的重复记录。拆卸应在两种情况下同时进行:
记录在以下条件下具有相同的值 score
柱
记录发生在8小时之内。
删除的记录应该是所有匹配记录中日期较旧的记录,因此新的查询结果中应该只显示匹配记录中最近的记录。
到目前为止,我只设法创建了一个代码来删除这样的重复,只有当记录发生在一个月的同一天,所以它丢失了任何连续两天的记录-如何解决这个问题?
原始数据库看起来像:
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
1条答案
按热度按时间ktecyv1j1#
我相信你要找的是date\u子函数
这将创建一个datetime,您可以在给定记录的8小时内进行比较以查找内容。我想写更多的答案,但看起来这是你唯一遗漏的部分。