根据条件创建缺失行

问题描述 投票:0回答:1

我正在使用 Netezza SQL。

我有以下两个表:

# table_a
id  year
1   2010
1   2011
1   2012
1   2013
1   2014
2   2010
2   2011
2   2012
2   2013
2   2014
3   2010
3   2011
3   2012
3   2013
3   2014

# table_b

id  year    var1
1   2010    A
1   2014    B
2   2012    A
2   2013    C
3   2010    A
3   2011    Z

我的问题:我正在尝试编写 SQL 代码来完成以下任务:

  • 第 1 步:对于 table_b 中的给定 ID,取最早的可用年份:我想在 2014 年之前为此 id 添加新行。例如,ID = 1 将添加 2011、2012、2013 年的行。Id = 2 将添加仅添加 2014 年的行。ID = 3 将添加 2012 年、2013 年、2014 年的行
  • 第 2 步:每当添加新行时,var1 的值都会被分配文本“不可用”
  • 但是,步骤 2 的唯一例外:如果给定 ID var1 = Z,则对于添加的所有新行,var1 将被分配值“Z”。

最终答案看起来像这样:

id  year    var1
1   2010    A
1   2011    not available
1   2012    not available
1   2013    not available
1   2014    B
2   2012    A
2   2013    C
2   2014    not available
3   2010    A
3   2011    Z
3   2012    Z
3   2013    Z
3   2014    Z

这是我迄今为止尝试过的:

第 1 部分: 我知道我需要首先创建缺失的行 - 我认为可以这样做:

select 
g.id,
h.year 
from
(select id, 
min(year) as start 
from table_b
group by id)g
join table_a h on
h.id 
between g.start and 2014)

但是从这里开始,我不知道如何继续。 有人可以告诉我如何继续解决这个问题吗?

注意:理想情况下,我想使用一组基本 CTE 来解决这个问题,因为 Netezza 中不提供递归函数。

谢谢!

sql netezza
1个回答
1
投票

执行左连接:

SELECT
a.id,
a.year,
COALESCE(b.var1, 'not available') AS var1
FROM a LEFT JOIN b ON a.id = b.id AND a.year = b.year

https://www.ibm.com/docs/en/psfa/7.2.1?topic=joins-left-outer-joinleft-join

https://www.ibm.com/docs/en/db2/11.5?topic=functions-coalesce

© www.soinside.com 2019 - 2024. All rights reserved.