我有交易表,数据如下。
acct_updt_tm | acct_id | acct_eff_dt | acct_cncl_dt | acct_canc_cd |
---|---|---|---|---|
2023-10-24 | 9873456 | |||
2023-10-14 | 9873456 | 2020-06-11 | 2023-12-01 | 01 |
2023-10-24 | 5567341 | |||
2023-10-14 | 5567341 | 2021-05-14 | 2022-12-12 | 01 |
需要编写一个查询,其中如果 acct_eff_dt 列的值为空,则输出应使用窗口函数 row_number 显示该字段的先前非空值,以仅提取该帐户的最新更新记录,如下所示。
预期输出
acct_updt_tm | acct_id | acct_eff_dt | acct_cncl_dt | acct_canc_cd |
---|---|---|---|---|
2023-10-24 | 9873456 | 2020-06-11 | ||
2023-10-24 | 5567341 | 2021-05-14 |
上面是两条记录,其中有最新的 acct_updt_tm,但原表中没有填充 acct_eff_dt。输出应填充这些记录的值
select * from (select acct_updt_tm,acct_id,acct_eff_dt,acct_cncl_dt,acct_canc_cd, row_number() over (partition by acct_id order by acct_updt_tm desc) as rnk) a where a.rnk=1
请帮助如何修改查询以获得要求。
您发布的代码看起来像 Oracle。如果是这样,
LAG
分析函数可能是一种选择。
样本数据:
SQL> with test (acct_updt_tm, acct_id, acct_eff_dt) as
2 (select to_date('2023-10-24 23:04:35', 'yyyy-mm-dd hh24:mi:ss'), 56, null from dual union all
3 select to_date('2023-10-14 19:34:11', 'yyyy-mm-dd hh24:mi:ss'), 56, date '2020-06-11' from dual union all
4 select to_date('2023-10-14 19:12:03', 'yyyy-mm-dd hh24:mi:ss'), 56, date '2020-06-10' from dual
5 )
查询:
6 select acct_updt_tm, acct_id,
7 nvl(acct_eff_dt, lag(acct_eff_dt) ignore nulls over (partition by acct_id order by acct_updt_tm)) acct_eff_dt
8 from test
9 order by acct_updt_tm desc;
ACCT_UPDT_TM ACCT_ID ACCT_EFF_DT
------------------- ---------- -------------------
2023-10-24 23:04:35 56 2020-06-11 00:00:00
2023-10-14 19:34:11 56 2020-06-11 00:00:00
2023-10-14 19:12:03 56 2020-06-10 00:00:00
SQL>