我的拳头表 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.PRSNID
和e.LOC
列分组,并通过PARTITION BY
子句 (PARTITION BY e.PRSNID ,e.LOC
(。
演示