2017-05-10 30 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 

希望你觉得这有帮助。