检索/更新某个列值中具有最小偏差的行

时间:2009-10-08 10:26:15

标签: sql mysql

我有一个数据库表,其中一列是日期。但是,有些行应该共享相同的日期,但由于插入滞后,它们之间会有一秒钟的差异。插入部分已经修复,但表中的当前数据也需要修复。

作为示例,存在以下数据:

2008-10-08 12:23:01   1   1   x
2008-10-08 12:23:01   1   2   y
2008-10-08 12:23:02   1   3   z

现在我要更新此示例中的最后一行,并将日期设置为“2008-10-08 12:23:01”。

4 个答案:

答案 0 :(得分:0)

适用于所有行::。

update yourtable set  date_added=date_added-'01';

为特定行添加where子句

答案 1 :(得分:0)

我能想到的最好的方法是编写一个外部脚本来做到这一点。确定哪些列是正确的以及哪些列应该更新而不必更多地控制分组是很棘手的。伪代码:

all_rows = SELECT * FROM table ORDER BY date
last_date = NULL
rows_to_update = []
for row in all_rows:
    if last_date is NULL or row.date - last_date > X seconds:
        set date to last_date for all rows from rows_to_update
        last_date = row.date
        rows_to_update = []
    else if row.date != last_date:
        rows_to_update += row

或者,类似这样的东西可以工作,但是如果想要处理所有三个日期不同并且你想将其中两个标准化为第一个的情况,你可能需要多次运行。

UPDATE
   tbl t,
   (SELECT
        t.date,
        (SELECT min(date)
         FROM tbl
         WHERE timestampdiff(SECOND,date,t.date) BETWEEN 1 AND 3) AS new_date
    FROM tbl t) t2
SET t.date=t2.new_date
WHERE t.date=t2.date AND t2.new_date IS NOT NULL

答案 2 :(得分:0)

  

由于插入滞后

为什么不在插入/更新第一行之前获取插入的日期并将其用于所有其他行?

答案 3 :(得分:0)

假设你有这个结构:

create table tbl(id int identity, dt datetime)
insert into tbl (dt) values('2009-10-08 12:23:01')
insert into tbl (dt) values('2009-10-08 12:23:01')
insert into tbl (dt) values('2009-10-08 12:23:02')
insert into tbl (dt) values('2009-10-08 12:23:05')
insert into tbl (dt) values('2009-10-08 12:23:05')
insert into tbl (dt) values('2009-10-08 12:23:06')

此查询仅显示每组迟到1秒的最后一项:

select distinct A.* from tbl A
join (select * from tbl) AS T on datediff(ss, T.dt, A.dt) = 1

将它与UPDATE语句结合使用,可以得到:

update tbl set dt = (select top 1 dt from tbl where tbl.id < A.id order by tbl.id desc)
from tbl A
join (select * from tbl) AS T on datediff(ss, T.dt, A.dt) = 1

然后将每组的最后一条记录更新为高于它的日期,并给出结果:

1           2009-10-08 12:23:01.000
2           2009-10-08 12:23:01.000
3           2009-10-08 12:23:01.000
4           2009-10-08 12:23:05.000
5           2009-10-08 12:23:05.000
6           2009-10-08 12:23:05.000

它快速,肮脏且未经优化,但对于一次性数据擦除,它应该工作。

请记得备份!