我在DB2中有一个数据集。PK列为PK_Ind,还有一个Logic_Ind列。我正在寻找的转换是对于相同的PK列,如果Logic_Ind为NULL,则尝试查找匹配,其中该特定行的END_DATE位于相同PK_Ind的任何其他行的START_DATE和END_DATE之间,并且Logic_Ind不为NULL (即Logic_Ind='A')。如果找到匹配,则应获取Col1、Col2和Col3的值,并为Logic_Ind为NULL的行填充这些值。
在下面的示例中,第3行应与第2行匹配,第7行应与第4行匹配,Col1、COl2和Col3应反映修改后的值第3行和第7行。
但是如果没有找到匹配项,那么仍然应该呈现与源数据集中相同的记录。
源数据集:

目标数据集:

发布于 2021-04-24 14:27:30
试试这个:
SELECT A.PK_IND, A.LOGIC_IND
, NVL2(A.LOGIC_IND, A.COL1, B.COL1) AS COL1
, NVL2(A.LOGIC_IND, A.COL2, B.COL2) AS COL2
, NVL2(A.LOGIC_IND, A.COL3, B.COL3) AS COL3
, A.START_DATE, A.END_DATE
FROM MYTAB A
LEFT JOIN TABLE
(
SELECT B.COL1, B.COL2, B.COL3
FROM MYTAB B
WHERE B.PK_IND = A.PK_IND
AND B.LOGIC_IND IS NOT NULL
AND A.END_DATE BETWEEN B.START_DATE AND B.END_DATE
FETCH FIRST 1 ROW ONLY
) B ON A.LOGIC_IND IS NULL;发布于 2021-04-24 11:08:07
您可以使用ROW_NUMBER()对所有可能的匹配项执行左连接(当Logic_Ind为null时),然后选择其中之一。
例如,您可以执行以下操作:
select *
from (
select
a.pk_ind,
a.logic_ind,
case when a.logic_ind is null then b.col1 else a.col1 end as col1,
case when a.logic_ind is null then b.col2 else a.col2 end as col2,
case when a.logic_ind is null then b.col3 else a.col3 end as col3,
a.start_date,
a.end_date,
row_number() over(partition by a.pk_ind, a.start_date
order by b.start_date) as rn
from t a
left join t b on b.pk_ind = a.pk_ind
and a.logic_ind is null
and b.end_date between a.start_date and a.end_date
) x
where rn = 1备注:顺便说一句,为了让ROW_NUMBER()函数按需工作,您需要为表提供一个PK。由于PK_Ind不是主键(您的数据示例显示重复的值),我猜测元组(a.pk_ind,a.start_date)可以充当主键。根据需要进行更改。
https://stackoverflow.com/questions/67237603
复制相似问题