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






你可能感兴趣的:(问题解决记录)