查询第一行sign_in等于3和上一行sign_in等于3的(找到第一个出现3的行)

模拟数据:

with t(dt,sign_in,num) as(
select date'2022-03-01',3,'A' from dual union all
select date'2022-02-16',3,'A' from dual union all
select date'2021-07-19',3,'A' from dual union all
select date'2021-06-29',3,'B' from dual union all
select date'2021-04-26',null,'A' from dual union all
select date'2021-02-23',3,'A' from dual union all
select date'2021-02-10',null,'A' from dual union all
select date'2020-06-29',1,'A' from dual union all
select date'2020-02-16',3,'A' from dual union all
select date'2019-07-19',3,'A' from dual union all
select date'2019-06-29',3,'A' from dual union all
select date'2019-04-26',null,'A' from dual union all
select date'2019-02-23',3,'A' from dual union all
select date'2019-02-10',null,'A' from dual union all
select date'2018-06-29',1,'A' from dual 
)
select * from t order by dt desc

查询第一行sign_in等于3和上一行sign_in等于3的(找到第一个出现3的行)
条件:两行之间所有的sign_in都是3,num必须是相等的,而且现在减去上一行DT时间要大于1年。

这个是在行云数据库使用,最好使用通用的语法实现。
想要的结果:

img

写sql还是太绕了,而且还不是oracle数据库,给你一个plsql吧

--测试数据
create table test_20220317_a as 
with t(dt,sign_in,num) as(
select date'2022-03-01',3,'A' from dual union all
select date'2022-02-16',3,'A' from dual union all
select date'2021-07-19',3,'A' from dual union all
select date'2021-06-29',3,'B' from dual union all
select date'2021-04-26',null,'A' from dual union all
select date'2021-02-23',3,'A' from dual union all
select date'2021-02-10',null,'A' from dual union all
select date'2020-06-29',1,'A' from dual union all
select date'2020-02-16',3,'A' from dual union all
select date'2019-07-19',3,'A' from dual union all
select date'2019-06-29',3,'A' from dual union all
select date'2019-04-26',null,'A' from dual union all
select date'2019-02-23',3,'A' from dual union all
select date'2019-02-10',null,'A' from dual union all
select date'2018-06-29',1,'A' from dual 
)
select t.* from t;

--检索数据
declare
l_dt date;
begin
  for rec_num in (select distinct num from test_20220317_a) loop --按num分组循环
    l_dt:=null; --每个分组都要初始化
  for rec in (select * from test_20220317_a where num=rec_num.num order by dt desc) loop --单个分组逐行循环
    if l_dt is null then --变量为空时,初始化为最新
      l_dt:=rec.dt;
    end if;
    if nvl(rec.sign_in,0) <>3 then --遇到不是3的,把最新时间清空
      l_dt:=null;
    end if;
    --if l_dt-rec.dt>365 then ---365天? 还是yyyy相差1?
    if to_char(l_dt,'yyyy')-to_char(rec.dt,'yyyy')>0 then ----yyyy相差1,则
      ---下面这条可以改成插表,执行完后再查表即可得结果
      dbms_output.put_line(to_char(l_dt,'yyyy-mm-dd')||','||to_char(rec.dt,'yyyy-mm-dd')||','||rec_num.num );
      --找完一个,把最新时间重新初始化
      l_dt:=null;
    end if;   
  end loop;
  end loop;
end;
/

执行结果

img