Hive综合案例练习(中级)第二题:查询至少连续三天下单的用户
创始人
2024-06-03 16:13:03

查询至少连续三天下单的用户

题目需求

查询订单信息表(order_info)中最少连续3天下单的用户id,期望结果如下:

user_id
101

题目解析

  • 第一步:用户一天可能存在多次下单的情况,所以需要对用户进行去重

去重方法如下:

--方法一:使用distinct
selectdistinctuser_id,create_date
from order_info;--方法二:使用group by
selectuser_id,create_date
from order_info
group by user_id, create_date;--方法二:使用窗口函數
selectuser_id,create_date
from
(selectuser_id,create_date,row_number() over (partition by user_id,create_date) rnfrom order_info
)t1
where rn=1;
  • 第二步:具体见各个方案。

代码实现

  • 方案一

    selectdistinct user_id
    from
    (selectuser_idfrom(selectuser_id,create_date,date_sub(create_date, row_number() over (partition by user_id order by create_date)) difffrom(selectuser_id,create_datefrom order_infogroup by user_id, create_date)t1)t2group by user_idhaving count(diff) >= 3
    )t3
    
  • 方案二

    selectdistinct user_id
    from
    (selectuser_id,datediff(lead2, create_date) difffrom(selectuser_id,create_date,lead(create_date, 2, '9999-12-31') over (partition by user_id order by create_date) lead2from(selectuser_id,create_datefrom order_infogroup by user_id, create_date)t1)t2
    )t3
    where diff=2;
    
  • 方案三

    selectdistinct user_id
    from
    (selectuser_id,ts,count(*) over (partition by user_id order by ts range between 86400 preceding and 86400 following) cntfrom(selectuser_id,unix_timestamp(create_date, 'yyyy-MM-dd') tsfrom(selectuser_id,create_datefrom order_infogroup by user_id, create_date)t1)t2
    )t3
    where cnt=3;
    

相关内容

热门资讯

十字对开门冰箱热卖排行榜 小户... 清晨阳光斜照进整洁的厨房,一碗隔夜炖好的银耳羹仍清润如初,青菜叶片挺括水灵,鸡蛋壳上还凝着细微水珠—...
最新冰箱性价比推荐 学生宿舍低... 清晨赶早课前顺手取一杯冰镇酸奶,深夜复习时打开冰箱拿一盒水果补充能量——对学生党而言,一台安静、省电...
再走长征路|心栖娄山:一个“候... 中经记者 王登海 黄永旭 遵义报道仲夏时节,黔北大地暑气渐盛,来自四川的退休教师赵俊毅提前20多天来...
铸魂聚力 实干兴业 (来源:沈阳日报)转自:沈阳日报  7月10日,全国五一劳动奖章获得者苏广林在中国工商银行沈阳南站支...
摩根大通AI投资组合回测跑赢传...   摩根大通最新发布的研究报告显示,其开发的八个人工智能投资代理在长达二十年的历史回测中,表现超越了...