2009-10-08 61 views
0

我有一個數據庫表,其中一列是日期。然而,一些行應該共享相同的日期,但由於插入的滯後,它們之間存在一秒的差異。插入部分已被固定,但表格中的當前數據也需要修正。檢索/更新某個列值中具有最小偏差的行

作爲一個例子,下面的數據是存在:

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秒」。

+0

您如何確定要更新哪些行?日期和其他列之間有一些關係嗎?每個日期總是必須有三排? –

+0

我想更新任何行X,其中有另一行Y在行X的日期的幾秒鐘內的日期。 – pbean

回答

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 
+0

我對錶提議的UPDATE查詢的SELECT部分​​運行,看起來好像列出了所有權限(新)日期的所有值,所以這正是我想要的。我已經嘗試了一個類似的查詢,但它返回了幾千行太多,而這個返回的數量恰到好處。 – pbean

0

對於所有行::。

update yourtable set date_added=date_added-'01'; 

特定行添加一個where子句

+0

那麼這個更新語句不是硬的部分,難的部分實際上是where子句獲取特定的行。 – pbean

+0

你只想更新最後一行或所有包含某個特定值的行或在修復插入延遲之前的時間 – halocursed

0

由於插入滯後

你爲什麼不得到插入日期前插入/更新的第一行和使用,對於所有其他行?

+0

我現在這樣做(這是修復),但數據庫中仍有舊行,日期混淆。事實上,一個完整的解決方案將引入一個新的數據庫佈局,但在這一刻我們不能這樣做。 – pbean

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 

它的快速和骯髒的和未優化的,但對於一個一次性的數據擦洗它應該工作。

記得備份!

相關問題