大数据SQL题02 查询至少连续三天下单的用户

本文介绍了如何使用SQL中的lead()和row_number()函数来查询order_info表中至少连续下单3天的用户ID。解题思路分别展示了通过窗口函数计算日期差和基于行号进行日期对比的方法。
摘要由CSDN通过智能技术生成

原题链接:http://practice.atguigu.cn/#/question/2/desc?qType=SQL

题目需求

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

user_id
101

订单信息表:order_info

order_id(订单id)user_id(用户id)create_date(下单日期)total_amount(订单金额)
11012021-09-3029000.00
101032020-10-0228000.00

解题思路1:lead()/lag()开窗

SELECT  user_id
FROM
(
	SELECT  user_id,
	        DATEDIFF(create_date,lag_2_date) AS diff
	FROM
	(
		SELECT  user_id,
		        create_date,
		        lag(create_date,2,'1970-01-01') over (partition by user_id ORDER BY create_date asc) AS lag_2_date
		FROM
		(
			SELECT  user_id,
			        create_date
			FROM order_info
			GROUP BY  user_id,
			          create_date
		) t1
	) t2
) t3
WHERE diff = 2
GROUP BY  user_id

解题思路2:row_number()日期对比

SELECT  user_id
FROM
(
	SELECT  user_id,
	        DATE_SUB(create_date,rn) AS flag
	FROM
	(
		SELECT  user_id,
		        create_date,
		        row_number() over (partition by user_id ORDER BY create_date asc) AS rn
		FROM
		(
			SELECT  user_id,
			        create_date
			FROM order_info
			GROUP BY  user_id,
			          create_date
		) t1
	) t2
) t3
GROUP BY  user_id,
          flag
HAVING COUNT(1) >= 3
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值