Sql 检索/更新在特定列值中偏差最小的行

Sql 检索/更新在特定列值中偏差最小的行,sql,mysql,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”。所有行::。 update yourtab

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

例如,提供了以下数据:

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”。

所有行::。

update yourtable set  date_added=date_added-'01';

对于特定的行,添加where子句,我能想到的最好的方法是编写一个外部脚本来实现这一点。很难确定哪些列是正确的,哪些应该更新,而不对分组进行更多的控制。伪代码:

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
由于插入滞后


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

假设您有以下结构:

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
它快速、肮脏且未优化,但对于一次性的数据清理,它应该可以工作


记得后退

如何确定要更新的行?日期与其他列之间是否存在某种关系?每个日期都必须有三行吗?我想更新任何X行,其中有另一行Y的日期在X行日期的几秒钟内。这个更新语句不是最难的部分,事实上,最难的部分是where子句来获取特定行。您是否只想更新最后一行或包含特定值的所有行,或者在您修复insert delayI之前,我对表运行了建议的update查询的SELECT部分,它似乎列出了所有值的所有正确(新)日期,所以这正是我想要的。我已经尝试过一个类似的查询,但是它返回的行太多了几千行,而这个查询返回的行数正好正确。我现在就这样做了(这是修复方法),但是数据库中仍然有日期混淆的旧行。事实上,一个完整的修复程序将引入一个新的数据库布局,但目前我们不能这样做。
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