也许会有第三个答案
with tab1 as (
SELECT TRAN_DT
FROM (SELECT TO_DATE('20210506','YYYYMMDD') TRAN_DT FROM DUAL UNION
SELECT TO_DATE('20210524','YYYYMMDD') TRAN_DT FROM DUAL UNION
SELECT TO_DATE('20210625','YYYYMMDD') TRAN_DT FROM DUAL UNION
SELECT TO_DATE('20210702','YYYYMMDD') TRAN_DT FROM DUAL UNION
SELECT TO_DATE('20210727','YYYYMMDD') TRAN_DT FROM DUAL UNION
SELECT TO_DATE('20210816','YYYYMMDD') TRAN_DT FROM DUAL UNION
SELECT TO_DATE('20210823','YYYYMMDD') TRAN_DT FROM DUAL UNION
SELECT TO_DATE('20211001','YYYYMMDD') TRAN_DT FROM DUAL UNION
SELECT TO_DATE('20211231','YYYYMMDD') TRAN_DT FROM DUAL)
)
, tab2 as (
select t1.tran_dt dt,
row_number() over(order by t1.tran_dt) rn
from tab1 t1
)
, t0(dt, rn, temp) as (
select t1.dt, rn, t1.dt from tab2 t1 where t1.rn = 1
union all
select t2.dt,
t2.rn,
case when t2.dt - t0.temp > 90 then t2.dt else t0.temp end
from tab2 t2, t0
where t0.rn + 1 = t2.rn
)
select t1.dt,
case when t1.dt = t1.temp then 'yes' else 'no' end,
nvl(t1.dt - lag(t1.temp) over(order by t1.rn), 0)
from t0 t1
第三个答案,也许还有第四个
with tab1 as (
SELECT TRAN_DT
FROM (SELECT TO_DATE('20210506','YYYYMMDD') TRAN_DT FROM DUAL UNION
SELECT TO_DATE('20210524','YYYYMMDD') TRAN_DT FROM DUAL UNION
SELECT TO_DATE('20210625','YYYYMMDD') TRAN_DT FROM DUAL UNION
SELECT TO_DATE('20210702','YYYYMMDD') TRAN_DT FROM DUAL UNION
SELECT TO_DATE('20210727','YYYYMMDD') TRAN_DT FROM DUAL UNION
SELECT TO_DATE('20210816','YYYYMMDD') TRAN_DT FROM DUAL UNION
SELECT TO_DATE('20210823','YYYYMMDD') TRAN_DT FROM DUAL UNION
SELECT TO_DATE('20211001','YYYYMMDD') TRAN_DT FROM DUAL UNION
SELECT TO_DATE('20211231','YYYYMMDD') TRAN_DT FROM DUAL)
)
, tab2 as (
select t1.tran_dt dt
from tab1 t1
order by t1.tran_dt
fetch next 1 row only
)
, t0(dt) as (
select t1.dt from tab2 t1
union all
select (select min(v1.TRAN_DT) from tab1 v1 where t1.dt + 90 < v1.TRAN_DT)
from t0 t1
where t1.dt is not null
)
select t1.dt
from t0 t1
where t1.dt is not null