【问题标题】:Update bulk data with correct information using SQL使用 SQL 使用正确的信息更新批量数据
【发布时间】:2017-05-10 05:46:54
【问题描述】:

我们已将错误数据填充到 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 来修复上述数据。 如果有人能在这方面提供帮助,不胜感激。

问候,

【问题讨论】:

  • 您在寻找 Oracle 解决方案还是 Netezza 解决方案?
  • 我正在寻找 Netezza 解决方案

标签: sql database netezza


【解决方案1】:

假设您要“修复”整个表,最有效的方法是根据此查询创建一个新表,然后在数据看起来不错后重命名旧表和新表:

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

【讨论】:

  • 在 netezza 中,我遇到了错误函数“EAD”不是分析聚合,而是使用窗口规范调用
  • 那么您可能不小心在 LEAD 函数调用的 L 和 EAD 之间添加了一些空格 - 或者 I 粘贴错误。是的 - 我错误地粘贴了 create table 命令。立即尝试
  • 一切都好,上面的 SQL 运行良好,非常感谢!非常感谢
【解决方案2】:

这是 tsql 中的代码(在 microsoft sql server 上运行)。对不起,我对 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

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2016-08-28
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多