我有一张有时间排序值的表:
id
date
value
value
对于数百条记录的记录通常是相同的,我希望能够确定value
何时发生变化。换句话说,我想知道d / dx(数据的导数)何时不等于0!
似乎应该有一个相当普遍的模式,但我找不到任何例子或自己想出一个。我确实发现an example已完成此更改检测,但我无法使用它,因为我的数据库适配器池连接和查询不一定在同一连接上发出。同样,我宁愿不使用数据库触发器。
这是一个示例表:
id | date | value
1 | 2011-04-05 12:00 | 33
2 | 2011-04-06 12:00 | 39
3 | 2011-04-07 12:00 | 39
...
72 | 2011-05-16 12:00 | 39
73 | 2011-05-17 12:00 | 37
74 | 2011-05-18 12:00 | 33
75 | 2011-05-19 12:00 | 33
...
我正在寻找可以撤回值更改的行的查询:
id | date | value
1 | 2011-04-05 12:00 | 33
2 | 2011-04-06 12:00 | 39
73 | 2011-05-17 12:00 | 37
74 | 2011-05-18 12:00 | 33
没有必要将第一行包含在结果中,因为具有相同值的表将返回零行(即没有更改)。
答案 0 :(得分:1)
SELECT t.id, t.date, t.value, if( (
SELECT td.value AS last_value
FROM tab td
WHERE td.date < t.date
ORDER BY td.date DESC
LIMIT 1
) <> t.value, 'changed', 'unchanged' ) AS cstatus
FROM tab t order by date
不是一个非常有效的查询,在大型集合上运行速度慢,但可以解决问题。 添加计数器可以将num_repeated称为另一列,在插入时更新将是更好的解决方案。
答案 1 :(得分:1)
呃,请使用group by
?
select min(id), min(date), value
from ...
group by value
order by id asc