2017-05-10 41 views
1

我們已經將錯誤數據填充到NZ數據庫中,並且還需要修復歷史數據。使用SQL更新具有正確信息的批量數據

錯誤的數據樣本

ID    |from_date   |to_date 
5002800000gvgQHAAY|2017-04-05 07:13:42|2017-05-04 07:27:03 
5002800000gvgQHAAY|2017-04-06 06:40:08|2017-05-04 07:27:03 
5002800000gvgQHAAY|2017-04-07 07:44:08|2017-05-04 07:27:03 
5002800000gvgQHAAY|2017-04-08 06:00:22|2017-05-04 07:27:03 
5002800000gvgQHAAY|2017-04-12 07:00:22|2017-05-04 07:27:03 
5002800000gvgQHAAY|2017-04-20 11:05:20|2017-05-04 07:27:03 
5002800000gvgQHAAY|2017-05-04 07:27:04|2999-12-31 00:00:00 

填充

ID    |from_date   |to_date 
5002800000gvgQHAAY|2017-04-05 07:13:42|2017-04-06 06:40:08 
5002800000gvgQHAAY|2017-04-06 06:40:08|2017-04-07 07:44:08 
5002800000gvgQHAAY|2017-04-07 07:44:08|2017-04-08 06:00:22 
5002800000gvgQHAAY|2017-04-08 06:00:22|2017-04-12 07:00:22 
5002800000gvgQHAAY|2017-04-12 07:00:22|2017-04-20 11:05:20 
5002800000gvgQHAAY|2017-04-20 11:05:20|2017-05-04 07:27:03 
5002800000gvgQHAAY|2017-05-04 07:27:04|2999-12-31 00:00:00 

正確方法只是在想,我們可以使用SQL來解決如上的數據。 如果有人可以幫助,非常感謝。

問候,

+0

您是在尋找Oracle解決方案還是Netezza解決方案? – APC

+0

我正在尋找Netezza解決方案 – NPK

回答

0

假設您想「修復」整個表格,最有效的方法是根據此查詢創建一個新表格,然後在數據看起來很好時重命名新舊錶格:

select id, from_date, 
lead(from_date,1, '2999-12-31 00:00:00') over (partition by id order by from_date) to_date 
from test_table order by id, from_date; 
     ID   |  FROM_DATE  |  TO_DATE  
--------------------+---------------------+--------------------- 
5002800000gvgQHAAY | 2017-04-05 07:13:42 | 2017-04-06 06:40:08 
5002800000gvgQHAAY | 2017-04-06 06:40:08 | 2017-04-07 07:44:08 
5002800000gvgQHAAY | 2017-04-07 07:44:08 | 2017-04-08 06:00:22 
5002800000gvgQHAAY | 2017-04-08 06:00:22 | 2017-04-12 07:00:22 
5002800000gvgQHAAY | 2017-04-12 07:00:22 | 2017-04-20 11:05:20 
5002800000gvgQHAAY | 2017-04-20 11:05:20 | 2017-05-04 07:27:04 
5002800000gvgQHAAY | 2017-05-04 07:27:04 | 2999-12-31 00:00:00 
(7 rows) 

create table new_test_table as 
select id, from_date, 
lead(from_date,1, '2999-12-31 00:00:00') over (partition by id order by from_date) to_date 
from test_table; 
INSERT 0 7 
+1

在netezza我得到下面的錯誤功能'EAD'不是一個解析聚合,但被稱爲一個窗口規範 – NPK

+0

然後,你可能已經意外地在L和EAD之間添加了一些空格LEAD函數調用 - 或* I *錯誤。是的 - 我錯誤地創建了表格命令。現在就試試 – ScottMcG

+0

所有的好東西,以上的SQL工作完美,謝謝一堆!非常感激 – NPK

0

這裏是TSQL代碼(運行Microsoft SQL Server上).Sorry我不熟悉的Netezza公司,由於沒有人響應,我會的。無論如何,Tsql看起來與netezzas sql很相似,所以你需要微調它在netezza中工作。基本上你會使用一些函數來獲取由from_date排序的行的索引。然後嘗試連接連續的行來轉換to_date。

declare @data table(
    ID varchar(50) NOT NULL, 
    from_date datetime NOT NULL, 
    to_date datetime NOT NULL 
) 

insert into @data (ID, from_date,to_date) VALUES 
('5002800000gvgQHAAY','2017-04-05 07:13:42','2017-05-04 07:27:03'), 
('5002800000gvgQHAAY','2017-04-06 06:40:08','2017-05-04 07:27:03'), 
('5002800000gvgQHAAY','2017-04-07 07:44:08','2017-05-04 07:27:03'), 
('5002800000gvgQHAAY','2017-04-08 06:00:22','2017-05-04 07:27:03'), 
('5002800000gvgQHAAY','2017-04-12 07:00:22','2017-05-04 07:27:03'), 
('5002800000gvgQHAAY','2017-04-20 11:05:20','2017-05-04 07:27:03'), 
('5002800000gvgQHAAY','2017-05-04 07:27:04','2999-12-31 00:00:00') 

;with cte_data(ID,from_date,to_date,row_idx) 
as 
(
    select ID,from_date,to_date, 
    ROW_NUMBER() OVER(ORDER BY from_date) row_idx 
    from @data 
) 
select data1.ID,data1.from_date, 
coalesce(data2.from_date,'2999-12-31 00:00:00') [to_date] 
from cte_data data1 
left join cte_data data2 on data2.row_idx = data1.row_idx + 1 

希望你覺得這有幫助。