一开始,我真的很抱歉我的英语不好。
我需要比较具有相同ID的行,如果它们是正确的,请连接它们:
id Date1 Date2 Date3 Date4
1210 2013-01-09 NULL 2018-04-10 2023-04-11
1210 2013-09-01 2018-10-04 2023-11-04 NULL
83 2009-11-17 NULL 2014-11-30 2016-11-30
83 2009-11-17 NULL NULL 2016-11-30
198 2008-04-22 NULL 2013-04-30 2015-04-30
198 2008-04-22 2013-04-30 2014-04-30 2015-04-30
198 2008-04-22 NULL NULL NULL
2070 1997-06-18 NULL 2002-09-30 N/A
2070 1997-06-18 2001-09-30 2002-09-30 NULL
2070 1997-06-18 NULL NULL 2002-09-30
我已经从中获取数据的行应该被删除。
效果应该是:
id Date1 Date2 Date3 Date4
1210 2013-01-09 NULL 2018-04-10 2023-04-11
1210 2013-09-01 2018-10-04 2023-11-04 NULL
83 2009-11-17 NULL 2014-11-30 2016-11-30
198 2008-04-22 NULL 2013-04-30 2015-04-30
198 2008-04-22 2013-04-30 2014-04-30 2015-04-30
2070 1997-06-18 2001-09-30 2002-09-30 2002-09-30
1210 - 未更改,因为部分日期不同。
83 - 比较然后应删除数据较少的行。
198 - 匹配的行数据被分配给第一个匹配的行,并删除该行。第二行未更改,因为部分日期不同。
2070 - 所有行合并为一行。附加的行被删除。
我试过make代码:
update tb
set tb.Date1 = case
when tj.Date1 is not null and (tb.Date1 is null or tb.Date1 = 'n/a') then tj.Date1 end,
tb.Date2 = case
when tj.Date2 is not null and (tb.Date2 is null or tb.Date2 = 'n/a') then tj.Date2 end,
tb.Date3 = case
when tj.Date3 is not null and (tb.Date3 is null or tb.Date3 = 'n/a') then tj.Date3 end,
tb.Date4 = case
when tj.Date4 is not null and (tb.Date4 is null or tb.Date4 = 'n/a') then tj.Date4 end
from
testcheck as tb inner join testcheck as tj on tb.Product_ID= tj.Product_ID
where (tb.Date1 = tj.Date1 or tb.Date1 is null or tj.Date1 is null or tb.Date1 = 'n/a' or tj.Date1 = 'n/a')
and (tb.Date2 = tj.Date2 or tb.Date2 is null or tj.Date2 is null or tb.Date2 = 'n/a' or tj.Date2 = 'n/a')
and (tb.Date3 = tj.Date3 or tb.Date3 is null or tj.Date3 is null or tb.Date3 = 'n/a' or tj.Date3 = 'n/a')
and (tb.Date4 = tj.Date4 or tb.Date4 is null or tj.Date4 is null or tb.Date4 = 'n/a' or tj.Date4 = 'n/a')
答案 0 :(得分:-1)
如果我处于你的情况,而不是尝试更新testcheck
表,我会使用查询以我想要的格式提取数据,然后将其插入到具有相同格式的新表中结构:
CREATE TABLE newtestcheck (id int, Date1 datetime, Date2 datetime, Date3 datetime,
Date4 datetime);
INSERT INTO newtestcheck
SELECT id,
Date1,
MAX(Date2),
MAX(Date3),
MAX(Date4)
FROM testcheck
GROUP BY id, Date1;
在此之后,您可以删除原始表格,然后根据需要将newtestcheck
重命名为testcheck
。
注意:您在其中一个日期列中有一个非常可疑的N/A
数据点。如果是文字,则表示您将日期存储为文本,然后我的查询将被修改。