我有一个包含这样的列的表:
id | timestamp | ...
我正在查找自上一行以来时间戳减少的行。
我尝试了这样的声明:
SELECT count(a.id)
FROM tbl AS a INNER JOIN tbl AS b ON a.id+1=b.id
WHERE a.timestamp<b.timestamp;
但似乎没有奏效。即使我期待一些,我也得到零结果。有什么建议是错的吗?
我也很感激有关更好地编写此查询的方法的任何想法。
我正在使用MySQL。
答案 0 :(得分:2)
您可以使用相关子查询获取先前的值,然后将其用于比较:
select t.*
from (select t.*,
(select t2.timestamp from tbl t2 where t2.id < t.id order by t2.id desc limit 1
) as prevts
from tbl t
) t
where timestamp < prevts;
您的查询问题可能是ID中存在空白。
编辑:
您可以使用变量执行此操作。挑战在于将变量比较和赋值放在单个表达式中。这是必需的,因为MySQL不保证select
语句中表达式的评估顺序。
以下内容为IsDecreasing
分配值并指定值:
select t.*
from (select t.*,
if(@prev > timestamp, if(@prev := timestamp, 1, 1),
if(@prev := timestamp, 0, 0)
) IsDecreasing
from tbl t cross join
(select @prev := -1) vars
order by id
) t
where IsDecreasing = 1;
这应该比以前的方法更快 - 可能即使你有正确的索引。