我不知道如何解决以下问题:我的数据库中有几行,每行有一个时间戳。现在我想过滤条目的所有行,直到任意两个日期的日期间隔大于30天。 我没有特定日期的明确日期间隔,例如在2017年1月12日至2017年1月11日期间,这对我来说很容易。我所知道的是,从一行到下一行的时间戳间隔(查询必须按时间戳desc排序)不得超过30天。
请在http://sqlfiddle.com/#!9/55a521/2查看我的数据库 在这种情况下,显示的最后一个条目应该是id 65404844 的条目。如果你能给我一点暗示,我将不胜感激。
非常感谢!
答案 0 :(得分:1)
您可以使用此查询构建过滤器。
SELECT
t.id,
from_unixtime(timestamp)
, IF(@pt < timestamp - 30*24*60*60, 1, 0) AS filter
, @pt := timestamp
FROM
t
, (SELECT @pt := MIN(timestamp) FROM t) v
ORDER BY timestamp
这里重要的是按时间戳排序。然后使用最低值初始化@pt
变量。另一个重要的事情是以正确的顺序使用select子句。
首先,将当前记录与IF()
函数中的变量进行比较。然后将当前记录分配给变量。这样,当评估下一行时,变量仍保留IF()
函数中前一行的值。
要获取所需的行,请在子查询中使用上述查询进行过滤。
SELECT id, ts FROM (
SELECT
t.id,
from_unixtime(timestamp) as ts
, IF(@pt < timestamp - 30*24*60*60, 1, 0) AS filter
, @pt := timestamp
FROM
t
, (SELECT @pt := MIN(timestamp) FROM t) v
ORDER BY timestamp
) sq
WHERE sq.filter = 1
答案 1 :(得分:-1)
这会筛选出与前一行差异超过30天的行。 (第一个解决方案) - 仅在id列具有连续值
时有效SELECT t.id, t.timestamp, DATEDIFF(FROM_UNIXTIME(t1.timestamp), FROM_UNIXTIME(t.timestamp)) AS days_diff
FROM tbl t
LEFT JOIN tbl t1
ON t.id = t1.id + 1
HAVING days_diff <= 30
ORDER BY t.timestamp DESC;
这会过滤每个其他条目30天内的所有结果。
SELECT *
FROM tbl t
WHERE EXISTS (
SELECT id
FROM tbl t1
WHERE DATEDIFF(FROM_UNIXTIME(t1.timestamp), FROM_UNIXTIME(t.timestamp)) < 30
AND t1.id <> t.id
)
ORDER BY t.timestamp desc;