李高飞 2022-03-17 09:58 采纳率: 100%
浏览 28
已结题

查询第一行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

  • 写回答

1条回答 默认 最新

  • DarkAthena ORACLE应用及数据库设计方案咨询师 2022-03-17 22:24
    关注

    写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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 3月25日
  • 已采纳回答 3月17日
  • 创建了问题 3月17日

悬赏问题

  • ¥15 怎样才能让鼠标沿着线条的中心线轨迹移动
  • ¥60 用visual studio编写程序,利用间接平差求解水准网
  • ¥15 Llama如何调用shell或者Python
  • ¥20 谁能帮我挨个解读这个php语言编的代码什么意思?
  • ¥15 win10权限管理,限制普通用户使用删除功能
  • ¥15 minnio内存占用过大,内存没被回收(Windows环境)
  • ¥65 抖音咸鱼付款链接转码支付宝
  • ¥15 ubuntu22.04上安装ursim-3.15.8.106339遇到的问题
  • ¥15 blast算法(相关搜索:数据库)
  • ¥15 请问有人会紧聚焦相关的matlab知识嘛?