具有三个公共值的行中的空值,第四个随着一个匹配而变化
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.PRSNID
和e.LOC
列分组。
Demo
【讨论】:
以上是关于具有三个公共值的行中的空值,第四个随着一个匹配而变化的主要内容,如果未能解决你的问题,请参考以下文章