今天遇到一个问题,需要查询用户连续下单的月份
这个跟查询用户连续登陆的天数一样 都是查询连续的时间或者数字
这样的查询在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