某宝店铺连续2天及以上购物的用户及其对应的天数

描述

11月结束后,小牛同学需要对其在某宝的网店就11月份用户交易情况和产品情况进行分析以更好的经营小店。

11月份销售数据表sales_tb如下(其中,sales_date表示销售日期,user_id指用户编号,item_id指货号,sales_num表示销售数量,sales_price表示结算金额):

sales_dateuser_iditem_idsales_numsales_price
2021-11-011A001190
2021-11-012A0022220
2021-11-012B0011120
2021-11-023C0012500
2021-11-024B0011120
2021-11-035C0011240
2021-11-036C0021270
2021-11-047A0031180
2021-11-048B0021140
2021-11-049B0011125
2021-11-0510B0031120
2021-11-0510B0041150
2021-11-0510A0031180
2021-11-0611B0031120
2021-11-0610B0041150

请你统计连续2天及以上在该店铺购物的用户及其对应的次数(若有多个用户,按user_id升序排序),以上例子的输出结果如下:

user_iddays_count
102

 解题思路:

1. 需要考虑如何求出连续天数的购买用户,所以需要考虑窗口函数来判断

2. 由于一个日期可能某用户会有多个购买记录,所以使用窗口函数时用dense_rank函数

3. 如何判断是否连续,考虑DATE_SUB或者DATE_ADD函数来判断,例如某用户11-4和11-5有购买记录,则11-4记为rk1,11-5记为rk2,通过DATE_SUB(date, INTERVAL rk DAY)来进行判断连续,11-4减1为11-3,11-5减2为11-3(如果连续,date_sub函数出来的日期应该是一样的,都为11-3,所以可以根据这个进行判断)

4. 将判断连续的函数放在group by 里面进行分组,统计用户的连续购买天数

5. 最后用HAVING筛选连续两天及以上购买的用户id

代码如下:

SELECT  user_id, COUNT(*) AS days_count
FROM (SELECT DISTINCT sales_date, 
                        user_id, 
                        dense_rank()over(partition by user_id order by sales_date) as rk
        FROM sales_tb) t1
group by  user_id, DATE_SUB(sales_date, INTERVAL rk day)
HAVING count(*)>=2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值