【问题标题】:Mysql - most recent record that was created over N days after the record before itMysql - 在它之前的记录之后 N 天创建的最新记录
【发布时间】:2016-11-21 21:26:10
【问题描述】:

我不知道这是否可能,但这就是我正在寻找的东西

如果创建的最后一条记录超过 N 天,或者在之前创建的第一条记录的 created_at 日期之后的 N 天内创建的第一条记录的 created_at,我需要当前日期

因此,例如,如果存在 2 条记录的创建日期相差大于 N 天,并且在这两个日期之间没有创建其他记录,请给我这些记录中最近创建的 created_at,除非最近的 created_at的所有记录大于 N 天前,在这种情况下,请改用今天的日期

所以给定这张表和 N = 5

+----+-------------+
|id  |created_at   |
+----+-------------+
|9   |1 day ago    |
|8   |2 days ago   |
|7   |3 days ago   |
|6   |4 days ago   |
|5   |5 days ago   | < not this date
|4   |6 days ago   | < get this date
|3   |12 days ago  | < not this date
|2   |13 days ago  | < not this date
|1   |20 days ago  |
+----+-------------+

我需要得到6 days ago,但不是13 days ago5 days ago,如果记录看起来像这样

+----+-------------+
|id  |created_at   |
+----+-------------+
|5   |11 day ago   | < not this date, instead today's date
|4   |12 days ago  |
|3   |20 days ago  |
|2   |21 days ago  |
|1   |30 days ago  |
+----+-------------+

我需要今天的日期

【问题讨论】:

  • created_at 日期还是字面意思是“11 天前”?
  • 这是一个日期,我只是觉得 X 天前的例子更容易阅读
  • 如果日期是 1,2,5,6,7,15 天前你想要 15 天前,因为间隔必须超过 N 天?

标签: mysql


【解决方案1】:

从计算相邻日期间隔的查询开始:

SELECT created_at, DATEDIFF(@prevdate, created_at) AS diff, @prevdate := created_at
FROM (SELECT created_at
      FROM yourTable
      WHERE created_at <= DATE_SUB(CURDATE(), INTERVAL @N DAY)
      ORDER BY created_at DESC) AS x,
CROSS JOIN (SELECT @prevdate := NULL) as vars

然后为diff 大于N 的行添加过滤器,并选择其中最新的

SELECT MAX(created_at) AS selected_date
FROM (SELECT created_at, DATEDIFF(@prevdate, created_at) AS diff, @prevdate := created_at
      FROM (SELECT created_at
            FROM yourTable
            WHERE created_at <= DATE_SUB(CURDATE(), INTERVAL @N DAY)
            ORDER BY created_at DESC) AS x
      CROSS JOIN (SELECT @prevdate := NULL) as vars) AS z
WHERE diff > @N;

最后,如果最近日期早于N 天前,则要获取当前日期,您可以加入另一个获取最近日期的查询,并使用IF()

SELECT IF (latest_date < DATE_SUB(CURDATE(), INTERVAL @N DAY), CURDATE(), MAX(created_at)) AS selected_date
FROM (SELECT created_at, DATEDIFF(@prevdate, created_at) AS diff, @prevdate := created_at
    FROM (SELECT created_at
          FROM yourTable
          WHERE created_at <= DATE_SUB(CURDATE(), INTERVAL @N DAY)
          ORDER BY created_at DESC) AS x
    CROSS JOIN (SELECT @prevdate := NULL) as vars) AS z
CROSS JOIN (SELECT MAX(created_at) AS latest_date FROM yourTable) AS y
WHERE diff > @N;

DEMO

【讨论】:

  • 我不认为这就是我要找的东西,它不会只返回比 N 天前的最新记录更新的第一条记录的 created_at 吗?
  • 那是你要求的,但自从我发帖以来你似乎改变了问题。
  • 对不起,我第一次通过示例不够详细
  • 您能否更新问题以更清楚地解释它?您更改了示例,但没有更改文本。
  • 我想我已经把它说得更清楚了......或者更令人困惑,我不确定用什么词来描述我的想法
【解决方案2】:

我去了

SELECT IF (latest_date < DATE_SUB(CURDATE(), INTERVAL @N DAY), CURDATE(), MAX(fetch_prevdate)) AS selected_date
FROM (SELECT created_at, @prevdate as fetch_prevdate, DATEDIFF(@prevdate, created_at) AS diff, @prevdate := created_at
      FROM (SELECT created_at
            FROM yourTable
            WHERE created_at <= DATE_SUB(CURDATE(), INTERVAL @N DAY)
            ORDER BY created_at DESC) AS x
      CROSS JOIN (SELECT @prevdate := NULL) as vars) AS z
CROSS JOIN (SELECT MAX(created_at) AS latest_date FROM yourTable) AS y
WHERE diff > @N;

Barmar 的回答是我需要的 99%,但我必须在日期差异子查询中添加一个字段来存储 @prevdate 值,然后在选择中进一步重新分配它并获得 MAX 而不是created_at 字段

【讨论】:

    猜你喜欢
    • 2013-10-23
    • 2016-11-10
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多