检索非空白列值

时间:2019-08-30 17:06:46

标签: sql apache-spark-sql pyspark-sql

我需要检索非空白的列值。

我有一个表客户,可能在某些列上包含重复项。该表还有一个列prev_band,它是一个nullable列。

要求是减少基于cust_id的重复行,并且每组仅输出1条记录,并根据以下规则填充prev_band值-

  • 如果所有记录(在特定组中)的prev_band为 空白/空,然后在输出行中填充空
  • 如果一行的值为Null,另一行的值为非空白,则 在输出行中填充该非空白值
  • 如果两行/所有行都具有非空白值,则使记录合格 来自客户,其eff_dt是记录中的最高价值 小于合约表对应的eff_dt 那个温柔。

客户表:

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表中的相应记录相比,pastcontract中。

我们只应考虑customer表中比eff_dt表大contract的记录。

请让我知道是否需要进一步说明。

谢谢

2 个答案:

答案 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