模拟数据:
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年。
这个是在行云数据库使用,最好使用通用的语法实现。
想要的结果:
写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;
/
执行结果