我需要检索非空白的列值。
我有一个表客户,可能在某些列上包含重复项。该表还有一个列prev_band
,它是一个nullable
列。
要求是减少基于cust_id
的重复行,并且每组仅输出1条记录,并根据以下规则填充prev_band
值-
cust_id | eff_dt | prev_band
10001 | 1/5/2019 | null
10001 | 1/7/2019 | High
10002 | 1/9/2018 | Low
10002 | 2/7/2019 | Medium
cust_id | eff_dt
10001 | 1/3/2019
10002 | 1/1/2019
cust_id | eff_dt | prev_band
10001 | 1/7/2019 | High
10002 | 2/7/2019 | Medium
对于10001
,它的一行中有非空白值,而客户中有另一个空白/空值,因此应填充非空白值。
但是,对于10002
,两个记录在prev_band中都具有有效值,因此应填充值'Medium',因为customer
表中该记录的eff_dt值是最大值,即小于10002
的合同表中相应的eff_dt值。另外,请注意,对于10002,不考虑使用1/9/2018
的记录,因为与1/9/2018
表中的相应记录相比,past
在contract
中。
我们只应考虑customer
表中比eff_dt
表大contract
的记录。
请让我知道是否需要进一步说明。
谢谢
答案 0 :(得分:0)
您仅对客户具有有效行的情况感兴趣,因此可以在两者之间进行内部联接。客户记录必须是prev_band值不为null的最新生效日期。尝试这样的事情:
select co.cust_id, cu.eff_dt, cu.prev_band
from contract co
inner join customer cu
on co.cust_id = cu.cust_id
and cu.eff_dt = (select max(eff_dt)
from
customer nc
where nc.eff_dt > co.eff_dt
and nc.cust_id = cu.cust_id
and nc.prev_band is not null
)
答案 1 :(得分:0)
请参见demo。我添加了更多记录,其中prev_band
均为NULL
,以涵盖您描述的第一种情况。
SELECT cu.cust_id, MAX(cu.eff_dt) AS eff_dt, MAX(prev_band) AS prev_band
FROM customer AS cu
LEFT JOIN contract AS co ON cu.cust_id = co.cust_id
WHERE cu.eff_dt >= co.eff_dt
GROUP BY cu.cust_id