【问题标题】:Find and Remove SQL records, if they occurred within 8 hours (except most recent record)查找并删除 SQL 记录,如果它们发生在 8 小时内(最近的记录除外)
【发布时间】:2018-11-13 22:43:44
【问题描述】:

我有一个 SQL 表,其中包含一些我想要删除的重复记录。 移除应同时在 2 个条件下进行:

  1. score 列下的记录具有相同的值
  2. 记录发生在 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


【解决方案1】:

我相信您正在寻找的是 DATE_SUB 函数

DATE_SUB(it.visited_at, INTERVAL 8 HOUR)

这将创建一个日期时间,您可以比较该日期时间来查找给定记录的 8 小时内的内容。我会写更多答案,但看起来这是您缺少的唯一难题。

【讨论】:

  • 添加的函数是 DATE_ADD() --- stackoverflow.com/questions/589652/…
  • 这无济于事,因为它只会在从实际访问时间减去 8 小时后给出日期时间。目前我首先创建visited_at的unixtimestam,它给出了自1970年1月1日以来的总秒数,一旦我有了总秒数,我将它除以86400(24小时的秒数),因此它将给出除法值,小数par将被忽略这样我就可以在同一天使用相同的差异值,然后按该差异值分组。
猜你喜欢
  • 1970-01-01
  • 2012-10-01
  • 2011-11-06
  • 1970-01-01
  • 1970-01-01
  • 2018-02-17
  • 1970-01-01
  • 2016-10-24
  • 2022-01-09
相关资源
最近更新 更多