Greenplum 4.3:填充缺失值

Posted

技术标签:

【中文标题】Greenplum 4.3:填充缺失值【英文标题】:Greenplum 4.3: Filling Missing values 【发布时间】:2018-04-12 04:29:00 【问题描述】:

我正在尝试使用 Greenplum 数据库 4.3.23.0 的 SQL

得到一个表,其中包含类似

的数据
ID  ID2    Code Type_ID Status  y_id    Latest_flag
10  10001   205   7        P    114         Y
10  10001   205   7        P    116       NULL
10  10002   205   6        P    116         Y
10  10002   205   6        P    120         Y

期望的输出

ID  ID2    Code Type_ID Status  y_id    Latest_flag
10  10001   205   7        P    114         Y
**10    10001   205   7        P    115     Y**
10  10001   205   7        P    116       NULL
10  10002   205   6        P    116         Y
**10    10002   205   6        P    117     Y**
**10    10002   205   6        P    118     Y
10  10002   205   6        P    119         Y**
10  10002   205   6        P    120         Y

到目前为止尝试的 SQL 查询

with a as
(
select
  id,
  id2,
  generate_series(minAD, maxAD, 1) dt
from (
       select
         id,
         id2,
         min(y_id) minAD,
         max(y_id) maxAD
       from table1
       where id in (10) 
       group by id, id2) a
)
select distinct a.* from (
select
a.id,
a.id2,
a.dt,
code,
type_id,
status,
Latest_flag,
from a
left join (select id,
           id2,
           y_id,
           t1.code,
           t1.type_id,
           t1.status,
           t1.latest_flag
         from table1 t1 where latest_flag = 'Y' 
        ) t1 on
               t1.id = a.id and t1.id2 = a.id2
and y_id <= dt 
order by t1.id, t1.id2, y_id desc) a

输出

ID  ID2    Code Type_ID Status  y_id    Latest_flag
10  10001   205   7        P    114         Y
10  10001   205   7        P    115         Y
**10    10001   205   7        P    116         Y**
10  10002   205   6        P    116         Y
10  10002   205   6        P    117         Y
10  10002   205   6        P    118         Y
10  10002   205   6        P    119         Y
10  10002   205   6        P    120         Y

如果我有一个包含所有 y_id 值且没有丢失数据的 ID,则无需执行任何操作。这必须根据具有 Latest_flag = 'Y' 的潜在客户值填补空白

谢谢

【问题讨论】:

【参考方案1】:

你很接近,你可以编写一个子查询来从表中获取latest_flag IS NULL,然后是LEFT JOINGenerate_series CTE。如果子查询的Latest_flagNULL 它们将匹配,所以使用CASE WHEN 表达式过滤Latest_flag

像这样:

WITH a 
     AS (SELECT a.*, 
                Generate_series(minad, maxad, 1) dt 
         FROM   (SELECT id, 
                        id2, 
                        code, 
                        type_id, 
                        status, 
                        Min(y_id) minAD, 
                        Max(y_id) maxAD 
                 FROM   table1 
                 WHERE  id IN ( 10 ) 
                 GROUP  BY id, 
                           id2, 
                           code, 
                           type_id, 
                           status) a) 
SELECT a.id, 
       a.id2, 
       a.code, 
       a.type_id, 
       a.status, 
       dt  "y_id", 
       CASE 
         WHEN t.id IS NULL 
              AND t.id2 IS NULL THEN 'Y' 
         ELSE  NULL 
       END Latest_flag 
FROM   a 
       LEFT JOIN (SELECT * 
                  FROM   table1 
                  WHERE  latest_flag IS NULL) t 
              ON a.id = t.id 
                 AND a.id2 = t.id2 
                 AND a.dt = t.y_id 

sqlfiddle:http://sqlfiddle.com/#!15/05b28/28

【讨论】:

以上是关于Greenplum 4.3:填充缺失值的主要内容,如果未能解决你的问题,请参考以下文章

R语言-均值填充缺失值

python 特征缺失值填充

使用 match_recognize 填充“缺失”值

pandas(12):数据清洗(缺失值)

机器学习数据预处理之缺失值:固定值填充

在R语言中进行缺失值填充:估算缺失值