当字段为空/null时如何获取该字段的前一行值

问题描述 投票:0回答:1

我有交易表,数据如下。

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

请帮助如何修改查询以获得要求。

sql oracle hive
1个回答
0
投票

您发布的代码看起来像 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>
© www.soinside.com 2019 - 2024. All rights reserved.