另一种选择是使用 LAG/LEAD 分析功能:
- LAG 从表中的前一行返回值。
- LEAD 从表的下一行返回值。
select rid
, LAG(hist_date) OVER(partition by rid order by hist_date ) as HIST_DATE_OLD
, hist_date as HIST_DATE
, LAG(value) OVER(partition by rid order by hist_date ) as VALUE_OLD
, value as VALUE_NEW
from hist
select rid
, lead(hist_date) OVER(partition by rid order by hist_date desc) as HIST_DATE_OLD
, hist_date as HIST_DATE
, lead(value) OVER(partition by rid order by hist_date desc) as VALUE_OLD
, value as VALUE_NEW
from hist
order by rid, hist_date
然后您可以根据需要进行过滤和格式化
select rid, VALUE_OLD, VALUE_NEW from (
select rid
, TO_CHAR(lead(hist_date) OVER(partition by rid order by hist_date desc), 'YYYY-MM-DD') as HIST_DATE_OLD
, TO_CHAR(hist_date , 'YYYY-MM-DD') as HIST_DATE
, lead(value) OVER(partition by rid order by hist_date desc) as VALUE_OLD
, value as VALUE_NEW
from hist
where HIST_DATE between '2020-03-31' and '2021-04-01'
and rid = 1
order by rid, hist_date
)
where HIST_DATE_OLD IS NOT NULL
RID VALUE_OLD VALUE_NEW
--- --------- ---------
1 V113 V114
select * from (
select rid
, TO_CHAR(lead(hist_date) OVER(partition by rid order by hist_date desc), 'YYYY-MM-DD') as HIST_DATE_OLD
, TO_CHAR(hist_date , 'YYYY-MM-DD') as HIST_DATE
, lead(value) OVER(partition by rid order by hist_date desc) as VALUE_OLD
, value as VALUE_NEW
from hist
order by rid, hist_date
)
where HIST_DATE between '2020-03-31' and '2021-04-01'
and rid = 1
RID HIST_DATE_OLD HIST_DATE VALUE_OLD VALUE_NEW
--- ------------- ---------- --------- ---------
1 2020-03-08 2020-04-11 V112 V113
1 2020-04-11 2021-03-15 V113 V114
注意主SELECT内外的过滤器
- 在外面,您在执行 LAG/LEAD 操作后进行过滤(上图)
- 在内部,您在执行 LAG/LEAD 操作之前进行过滤(如下)
RID HIST_DATE_OLD HIST_DATE VALUE_OLD VALUE_NEW
--- ------------- ---------- --------- ---------
1 2020-04-11 V113
1 2020-04-11 2021-03-15 V113 V114