检测mysql中数据集内的更改

时间:2011-04-29 02:55:30

标签: mysql sql

我有一张有时间排序值的表:

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

没有必要将第一行包含在结果中,因为具有相同值的表将返回零行(即没有更改)。

2 个答案:

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