使用 SQL 使用正确的信息更新批量数据
Update bulk data with correct information using SQL
我们已将错误的数据填充到 NZ 数据库中,随着修复,我们还需要修复历史数据。
错误的数据样本
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 来修复上面的数据。
如果有人可以提供帮助,我将不胜感激。
此致,
这是 tsql 中的代码(在 Microsoft sql 服务器上运行)。抱歉,我不熟悉 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
希望这对您有所帮助。
假设您想要 "fix" 整个 table,最有效的方法是基于此查询创建一个新的 table,然后重命名旧的和新的 table 一旦数据看起来不错:
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
我们已将错误的数据填充到 NZ 数据库中,随着修复,我们还需要修复历史数据。
错误的数据样本
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 来修复上面的数据。 如果有人可以提供帮助,我将不胜感激。
此致,
这是 tsql 中的代码(在 Microsoft sql 服务器上运行)。抱歉,我不熟悉 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
希望这对您有所帮助。
假设您想要 "fix" 整个 table,最有效的方法是基于此查询创建一个新的 table,然后重命名旧的和新的 table 一旦数据看起来不错:
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