戏言zare 2021-12-21 14:48 采纳率: 100%
浏览 44
已结题

sql查询问题对于某一字段连续且重复,只取一

sql查询结果中,对于某一字段连续重复时,只取第一条(或最后一条),例如:

img


以上结果集中,我想让他变成
c_time status
2021-12-21 14:20:39.813 1
2021-12-21 14:22:39.817 0
2021-12-21 14:24:39.817 1


根据status字段,把结果里相连的,重复的行数只取其中一行,要怎么写查询语句?

  • 写回答

5条回答 默认 最新

  • DarkAthena ORACLE应用及数据库设计方案咨询师 2021-12-21 15:15
    关注

    这里要使用开窗函数进行分组排序

    select c_time,status from 
    (select row_number() over(partition by status order by c_time) rn,c_time,status from 表 ) as t
    where rn=1
    

    里面的 order by c_time,加ASC或者DESC可以决定是取第一条还是最后一条


    根据题主补充描述,应该使用以下sql

    create table table1 (index1 int, status1 int);
    insert into table1 values (0, 0);
    insert into table1 values (1, 0);
    insert into table1 values (2, 0);
    insert into table1 values (3, 0);
    insert into table1 values (4, 1);
    insert into table1 values (5, 1);
    insert into table1 values (6, 0);
    insert into table1 values (7, 0);
    insert into table1 values (8, 0);
    insert into table1 values (9, 0);
    insert into table1 values (10, 1);
    insert into table1 values (11, 1);
    insert into table1 values (12, 1);
    insert into table1 values (13, 1);
    insert into table1 values (14, 1);
    insert into table1 values (15, 0);
    insert into table1 values (16, 0);
    
    select index1, status1
      from (select nvl(lag(status1) over(order by index1),-1) last_status,
                   index1,
                   status1
              from table1)  
     where last_status<>status1;
    

    实测和题主要求一致

    img

    以上是在oracle数据库中进行的测试,如果是在其他数据库,nvl空值处理的函数可能要换成对应数据库中的函数

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 12月30日
  • 已采纳回答 12月22日
  • 创建了问题 12月21日

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器