我有一张表ACQUISITION
,有1 720 208行。
------------------------------------------------------
| id | date | value |
|--------------|-------------------------|-----------|
| 1820188 | 2011-01-22 17:48:56 | 1.287 |
| 1820187 | 2011-01-21 21:55:11 | 2.312 |
| 1820186 | 2011-01-21 21:54:00 | 2.313 |
| 1820185 | 2011-01-20 17:46:10 | 1.755 |
| 1820184 | 2011-01-20 17:45:05 | 1.785 |
| 1820183 | 2011-01-19 18:21:02 | 2.001 |
------------------------------------------------------
遇到问题后,我需要找到差异小于两分钟的每一行。
理想情况下,我应该可以在这里找到:
| 1820187 | 2011-01-21 21:55:11 | 2.312 |
| 1820186 | 2011-01-21 21:54:00 | 2.313 |
| 1820185 | 2011-01-20 17:46:10 | 1.755 |
| 1820184 | 2011-01-20 17:45:05 | 1.785 |
如果你有任何想法,我在这里很迷失。
答案 0 :(得分:1)
让我们以微妙的方式重述您的问题,以便我们可以在宇宙热死之前完成此查询。
"我需要知道表中的连续记录,时间戳比两分钟更接近。"
我们可以将"连续"的概念联系起来。你的id值。
尝试此查询,看看您是否获得了不错的效果(http://sqlfiddle.com/#!9/28738/2/0)
SELECT a.date first_date, a.id first_id, a.value first_value,
b.id second_id, b.value second_value,
TIMESTAMPDIFF(SECOND, a.date, b.date) delta_t
FROM thetable AS a
JOIN thetable AS b ON b.id = a.id + 1
AND b.date <= a.date + INTERVAL 2 MINUTE
使用ON b.id = a.id + 1
将自联接工作负载带到脚跟。并且,避免在两个date
列值之一上使用函数允许查询利用该列上可用的任何索引。
在(id,date,value)
上创建覆盖索引将有助于执行此查询。
如果连续行假设在此数据集中不起作用,您可以尝试此操作,将每行与下一行进行比较。它会慢一些。 (http://sqlfiddle.com/#!9/28738/6/0)
SELECT a.date first_date, a.id first_id, a.value first_value,
b.id second_id, b.value second_value,
TIMESTAMPDIFF(SECOND, a.date, b.date) delta_t
FROM thetable AS a
JOIN thetable AS b ON b.id <= a.id + 10
AND b.id > a.id
AND b.date <= a.date + INTERVAL 2 MINUTE
如果id
值作为排序行的方式完全没价值,那么您需要这样做。而且,它会很慢。 (http://sqlfiddle.com/#!9/28738/5/0)
SELECT a.date first_date, a.id first_id, a.value first_value,
b.id second_id, b.value second_value,
TIMESTAMPDIFF(SECOND, a.date, b.date) delta_t
FROM thetable AS a
JOIN thetable AS b ON b.date <= a.date + INTERVAL 2 MINUTE
AND b.date > a.date
AND b.id <> a.id
答案 1 :(得分:0)
使用表格SELF JOIN
并使用{/ 1}}函数
TIMEDIFF()