题解 | #10月的新户客单价和获客成本#

10月的新户客单价和获客成本

http://www.nowcoder.com/practice/d15ee0798e884f829ae8bd27e10f0d64

SELECT 
	ROUND(SUM(total_amount)/COUNT(*),1) avg_amount,
	-- 总销售额/总人数 即为平均交易金额
	ROUND(SUM(total_discount)/COUNT(*),1) avg_cost
	-- 总优惠金额/总人数 即为平均获客成本
  FROM 
  (
	  SELECT 
		tb1.order_id,
		total_amount,
		total_money, 
		total_money-total_amount total_discount
	  FROM 
		  (
			  SELECT 
				uid,
				order_id,
                event_time,
		      		rank() over(PARTITION BY uid ORDER BY event_time) rk,
		      		-- 按下单时间升序,后面令rk=1,即首单
		      		-- 这里不进行group by之后再min()计算首单原因:group by之后最好是做聚合运算,如果SELECT数据,一般默认是第一条,那么所选数据就不一定是首单了
				total_amount 
			  FROM tb_order_overall oo
		  )tb1 -- 得到每个客户ID、订单ID、下单时间、下单时间排序、订单总价(实际金额)
	  LEFT JOIN 
		  (
			  SELECT order_id,SUM(price*cnt) total_money
			  FROM  tb_order_detail 
			  GROUP BY order_id
		  ) tb2 -- 得到客户订单号、以及本应该花费的钱(未优惠的)
	  ON tb1.order_id=tb2.order_id -- 将tb1和tb2连接起来
      WHERE rk = 1 
      -- rk=1主要是想筛选出最早的订单,即首单
      AND  DATE(event_time) BETWEEN '20211001' AND '20211031' 
      -- 要求是2021年10月的,一定不要在tb1就筛选出来了,会出错;因为来与tb2相连时就会缺少这部分数据(不会有所有的订单号)
  ) tb
全部评论
请问 为什么不能在tb1就筛选出来时间呀,筛出来的订单号如果在TB2没有得话,就算与TB2 join在一起了也不会有的吧?这点没太想得明白,求解答
1 回复 分享
发布于 2022-04-15 13:16
我说咋一直错,我时间一直放到里面
点赞 回复 分享
发布于 2023-06-27 14:41 辽宁
为什么用groupby 再用min()最后得到的不一定是首单
点赞 回复 分享
发布于 2023-06-26 15:14 辽宁

相关推荐

不愿透露姓名的神秘牛友
07-11 15:37
点赞 评论 收藏
分享
风中翠竹:真的真的真的没有kpi。。。面试官是没有任何kpi的,捞是真的想试试看这个行不行,碰碰运气,或者是面试官比较闲现在,没事捞个人看看。kpi算HR那边,但是只有你入职了,kpi才作数,面试是没有的。
双非有机会进大厂吗
点赞 评论 收藏
分享
06-12 10:50
门头沟学院 Java
你的不定积分没加C:我怎么在学院群看到了同样的话
点赞 评论 收藏
分享
评论
8
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务