oracle实现查询某状态标志位最大连续出现次数( row_number() over(PARTITION BY)使用 )

本文介绍了一种使用Oracle分析函数ROW_NUMBER()来查询数据库中最大连续失败次数的方法。通过对比不同排序下的序列号差值,可以找出连续失败的交易记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先讲下需求背景:

系统中有一张记录交易流水的表,

表结构大致包含:交易流水、交易状态(成功0、失败3、未知2)、交易时间、等等其他业务相关字段。

业务场景:交易流水为记录每天交易情况的表,鉴于实际情况可能出现连续交易失败的情况,也可能会有连续成功中间夹着这未知或者失败的情况。

业务需求:查出最大连续失败次数。

 

下图是数据库中部分数据展示,可以看到其中包含连续出现 失败3 的状态码。

 

具体该如何实现该功能呢?

这里使用了oracle的分析函数。ROW NUMBER() OVER()

ROW_NUMBER() OVER (ORDER BY col1 DESC) 是先把col1 列降序,再为降序以后的没条col1 记录返回一个序号。

ROW_NUMBER() OVER(partition by col1 order by col2) 表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内是连续且唯一的)。

具体实现sql如下:

 

select trans_status, count(1)
  from (select trans_id,
               trans_status,
               -- row_number() over(order by trans_id),
               -- row_number() over(partition by trans_status order by trans_id),
               row_number() over(order by trans_id) - row_number() over(partition by trans_status order by trans_id) sx
          from wallet_txn_info
         where 
            to_char(create_timestamp, 'yyyymmdd') = '2018101'
         order by trans_id)
 where trans_status = '3'
 group by trans_status, sx

 

查询结果:

 

至此只需在外部套一层 max就能查处最大连续出现次数;

 

分析:

使用 row_number() over(order by trans_id) 减去 row_number() over(partition by trans_status order by trans_id) 的原理在于 前半部是根据transid排序的序列号,后半部为根据trans_status分组后再根据transid排序的序列号。当出现连续的相同trans_status时其前半部序列减去后半部序列的差值是一样的。最终根据差值group即出结果。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值