SQL查找值不增加的行

时间:2014-11-15 00:00:50

标签: mysql sql

我有一个包含这样的列的表:

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。

1 个答案:

答案 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;

这应该比以前的方法更快 - 可能即使你有正确的索引。