具有三个通用值的行中的空值,第四个值随一个匹配项而变化



我的拳头表 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 上的值(必需的连接条件(。 当与 TEMP1 连接的 TEMP2 中不存在STAT_IMPRT_VAR时,我得到空值。

我需要行计数以匹配 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

小于 TEMP1 中更改的状态的有效 QTRYR 应保持与初始 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 而更改时,空值是问题。

您可以尝试以下查询,其中我们派生了一列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)

干杯!!

您可以使用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列的更改步骤应按e.PRSNIDe.LOC列分组,并通过PARTITION BY子句 (PARTITION BY e.PRSNID ,e.LOC(。

演示

相关内容

  • 没有找到相关文章

最新更新