sql经典问题-查询连续的时间

今天遇到一个问题,需要查询用户连续下单的月份

这个跟查询用户连续登陆的天数一样 都是查询连续的时间或者数字

这样的查询在oracle中需要用到ROW_NUMBER() OVER(partition by 分组的列 order by 排序的列)函数


举例如下:

今天是5号

表A

用户 登陆的日期   用户在表中用userid字段表示 日期date

a            5

a            4

a            3

a            2

b            5

b            4

b            2

b            1

c            4

c            3

需要得到的结果是

用户 连续登陆的天数

a            4

b            2


sql实现

select userid, date, ROW_NUMBER() OVER(partition by userid order by date desc) as rn   ---这里按用户分组 然后按date排序

from A

这个sql查出来的结果 就是

用户 登陆的日期   rn

a            5             1        

a            4             2

a            3             3

a            2             4

b            5             1

b            4             2

b            2             3

b            1             4

c            4             1

c            3             2

做一个处理,让大家看的更清楚一些

用户 登陆的日期   5-rn (用当天日期减去排序号)

a            5             4        

a            4             3

a            3             2

a            2             1

b            5             4

b            4             3

b            2             2

b            1             1

c            4             4

c            3             3

可以看出来 登陆的日期减去 (5-rn) = 1 就表明是连续登陆


我们继续处理sql,把上面查出来的命名为表B

select userid, min(5-rn) from B WHERE date - (5-rn) = 1 group by userid

取出最小的5-rn差值然后再用5减去就是连续的天数了

结果

a    1

b    3

再用5去减

a    4

b    2






  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值