具有三个公共值的行中的空值,第四个随着一个匹配而变化

Posted

技术标签:

【中文标题】具有三个公共值的行中的空值,第四个随着一个匹配而变化【英文标题】:Nulls in rows with three common value, fourth varies with one match 【发布时间】:2019-08-18 15:51:55 【问题描述】:

我的第一个表 TEMP1 有代码记录状态开始时的周期。

+PRSNID | LVL2  |  LOC   |   initialQTRYR | STAT_IMPRT_VAR

*a      |  AA   |  CHI   |    0118        |     z

*b      |  AA   |  CHI   |    0318        |     z

*b      |  AA   |  LOS   |    0119        |     y

*c      |  AA   |  LOS   |    0119        |     z

*d      |  BB   |  CHI   |    0118        |     y

行数:100

我的第二个表 TEMP2 有一列包含所有 EMPLID 期间的代码。

+PRSNID | LVL2  |  LOC  |    validQTRYR  

*a      |  AA   |  CHI  |      0118      

*a      |  AA   |  CHI  |      0218

*a      |  AA   |  CHI  |      0318     

*b      |  AA   |  CHI  |      0318

*b      |  AA   |  CHI  |      0418      

*b      |  AA   |  LOS  |      0119

*b      |  AA   |  LOS  |      0219

*c      |  AA   |  LOS  |      0119

*c      |  AA   |  LOS  |      0219      

*d      |  BB   |  CHI  |      0118

*d      |  BB   |  CHI  |      0218

*d      |  BB   |  CHI  |      0318      

行数:500

我离开了将两个表 TEMP2 连接到 TEMP1 并拉回加入 EMPLID、LVL2、LOC、QTRYR 的值(必需的连接条件)。当 TEMP2 中没有 STAT_IMPRT_VAR 与 TEMP1 连接时,我得到空值。

我需要行数来匹配 TEMP2。

+PRSNID | LVL2  |  LOC   |   drvdQTRYR | STAT_IMPRT_VAR

*a      |  AA   |  CHI   |    0118     |   z

*a      |  AA   |  CHI   |    0218     |  <null>

*a      |  AA   |  CHI   |    0318     |  <null>

*b      |  AA   |  CHI   |    0318     |   z

*b      |  AA   |  CHI   |    0418     |  <null> 

*b      |  AA   |  LOS   |    0119     |   y

*b      |  AA   |  LOS   |    0219     |  <null>

*c      |  AA   |  LOS   |    0119     |   z

*c      |  AA   |  LOS   |    0219     |  <null> 

*d      |  BB   |  CHI   |    0118     |   y

*d      |  BB   |  CHI   |    0218     |  <null>

*d      |  BB   |  CHI   |    0318     |  <null>

行数:500

我需要表格看起来像这样

+PRSNID |  LVL2 |   LOC  |    drvdQTRYR | STAT_IMPRT_VAR

*a      |  AA   |  CHI   |    0118      |   z

*a      |  AA   |  CHI   |    0218      |   z

*a      |  AA   |  CHI   |    0318      |   z

*b      |  AA   |  CHI   |    0318      |   z

*b      |  AA   |  CHI   |    0418      |   z 

*b      |  AA   |  LOS   |    0119      |   y

*b      |  AA   |  LOS   |    0219      |   y

*c      |  AA   |  LOS   |    0119      |   z

*c      |  AA   |  LOS   |    0219      |   z

*d      |  BB   |  CHI   |    0118      |   y

*d      |  BB   |  CHI   |    0218      |   y

*d      |  BB   |  CHI   |    0318      |   y

行数:500

validQTRYR 小于 TEMP1 中更改的状态应保持与初始 QTRYR 相同的状态。任何帮助将不胜感激。

我已经建立了几个临时表并尝试内连接以获取 STAT_IMPRT_VAR。

SELECT e.PRSNID, 
e.LVL2    
e.LOC 
CASE a.initialQTRYR  
 WHEN e.validQTRYR  THEN a.initialQTRYR  
 ELSE e.validQTRYR  
END drvdQTRYR,
e.STRM, 
a.STAT_IMPRT_VAR
FROM TEMP2 e
LEFT OUTER JOIN TEMP1 a
ON e.PRSNID= a.PRSNID
AND e.LOC = a.LOC 
AND e.LVL2    = a.LVL2    
AND e.validQTRYR  = a.initialQTRYR  

我需要表格看起来像这样

+PRSNID |  LVL2 |   LOC  |    drvdQTRYR | STAT_IMPRT_VAR

*a      |  AA   |  CHI   |    0118      |   z

*a      |  AA   |  CHI   |    0218      |   z

*a      |  AA   |  CHI   |    0318      |   z

*b      |  AA   |  CHI   |    0318      |   z

*b      |  AA   |  CHI   |    0418      |   z 

*b      |  AA   |  LOS   |    0119      |   y

*b      |  AA   |  LOS   |    0219      |   y

*c      |  AA   |  LOS   |    0119      |   z

*c      |  AA   |  LOS   |    0219      |   z

*d      |  BB   |  CHI   |    0118      |   y

*d      |  BB   |  CHI   |    0218      |   y

*d      |  BB   |  CHI   |    0318      |   y

当没有匹配项并且状态随着 TEMP1 中从 z 到 y 的更新而发生变化时,就会出现空值问题。

【问题讨论】:

请编辑您的问题以使用相关信息清楚地定义您的问题。很难理解,因为它是 【参考方案1】:

您可以尝试以下查询,其中我们派生了一列 sum_rn 以进行进一步分组。

With your_query as
(SELECT e.PRSNID, 
        e.LVL2,   
        e.LOC,
        CASE a.initialQTRYR  
        WHEN e.validQTRYR  THEN a.initialQTRYR  
        ELSE e.validQTRYR  
        END drvdQTRYR,
        e.STRM, 
        a.STAT_IMPRT_VAR
        FROM TEMP2 e
        LEFT OUTER JOIN TEMP1 a
        ON e.PRSNID= a.PRSNID
        AND e.LOC = a.LOC 
        AND e.LVL2    = a.LVL2    
        AND e.validQTRYR  = a.initialQTRYR)

select prsn_id,
       lvl2,
       loc,
       drvdqtryr,
       Strm,
       max(STAT_IMPRT_VAR) 
       over (partition by prsn_id, sum_rn order by null) as STAT_IMPRT_VAR
       from
      (select t.prsn_id,
              t.lvl2,
              t.loc,
              t.drvdQTRYR,
              t.STRM, 
              t.STAT_IMPRT_VAR,
              Sum(case when t.STAT_IMPRT_VAR is not null then 1 end) 
              over (partition by t.prsn_id order by to_date(drvdqtryr,'mmyy')) as sum_rn
        From your_query)

干杯!!

【讨论】:

【参考方案2】:

你可以使用FIRST_VALUE() OVER (...)解析函数:

SELECT e.PRSNID,
       e.LVL2,    
       e.LOC, 
       CASE a.initialQTRYR  
           WHEN e.validQTRYR  THEN a.initialQTRYR  
           ELSE e.validQTRYR  
       END drvdQTRYR,
     --e.STRM, 
       FIRST_VALUE(a.STAT_IMPRT_VAR) OVER 
                               (PARTITION BY e.PRSNID ,e.LOC ORDER BY e.PRSNID,e.LOC DESC)
       AS STAT_IMPRT_VAR
  FROM TEMP2 e
  LEFT JOIN TEMP1 a
    ON e.PRSNID = a.PRSNID
   AND e.LOC = a.LOC 
   AND e.LVL2 = a.LVL2    
   AND e.validQTRYR = a.initialQTRYR;

a.STAT_IMPRT_VAR 列的更改步骤应通过PARTITION BY 子句(PARTITION BY e.PRSNID ,e.LOC)按e.PRSNIDe.LOC 列分组。

Demo

【讨论】:

以上是关于具有三个公共值的行中的空值,第四个随着一个匹配而变化的主要内容,如果未能解决你的问题,请参考以下文章

在除前两列之外的每列上前向填充具有最新非空值的空值

有条件地显示具有匹配值的单元格的行中的值

pandas 怎么处理表格中的空值

Apache Spark:如何使用 Java 在 dataFrame 中的空值列中插入数据

SQL 中的 LISTAGG 返回具有空值的行

电源查询。合并具有折叠值的行中的重复行