题解 | #10月的新户客单价和获客成本#
10月的新户客单价和获客成本
https://www.nowcoder.com/practice/d15ee0798e884f829ae8bd27e10f0d64
select round(sum(total_amount)/count(distinct uid),1), round(sum(discount)/count(distinct uid),1) from ( select order_id, uid, total_amount, before_price-total_amount discount from tb_order_overall left join ( select order_id, sum(price*cnt) before_price from tb_order_detail group by order_id)t1 using(order_id) where date_format(event_time,'%Y-%m') = '2021-10' and (uid, event_time) in (select uid, min(event_time) from tb_order_overall group by uid)
select round(sum(total_amount)/count(distinct uid),1), round(sum(discount)/count(distinct uid),1) from ( select order_id, uid, total_amount, before_price-total_amount discount from tb_order_overall left join ( select order_id, sum(price*cnt) before_price from tb_order_detail group by order_id)t1 using(order_id) where (uid, event_time) in (select uid, min(event_time) from tb_order_overall where date_format(event_time,'%Y-%m') = '2021-10' group by uid)
第一段是正确的,第二段是错误的,区别在于正确的代码将日期的挑选放在了in语句的外面,这样可以保证我们挑选的uid就是在十月份购买的顾客,如果将日期筛选条件放在in语句里面而不在大条件下进行日期筛选的话,就容易将九月份的购买额也算进去,因为in语句只是对uid的一个选择,例如:
uid | event_time | total_amount |
101 | 2021-9-30 | 50 |
101 | 2021-10-1 |
30 |
102 | 2021-10-8 | 20 |
错误的代码运行结果(对uid选择时才对日期筛选):
uid | sum(total_amount) |
101 | 80 |
102 | 20 |
uid | sum(total_amount) |
101 | 50 |
102 | 20 |
所以说,我那个错误的代码会使结果变大