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