select round(avg(total_amount),1) as avg_amount
,round(avg(raw_amount-total_amount),1) as avg_cost
from(
select uid,sum(price*cnt) as raw_amount
,max(total_amount) total_amount
from(
select uid,
date(event_time) event_day,
total_amount,price,cnt,
rank() over(partition by uid order by event_time) as irank
from tb_order_overall t2
left join tb_order_detail t3
on t2.order_id = t3.order_id
)as t1
where irank = 1 and event_day between '2021-10-01' and '2021-10-31'
group by uid
)as t2
一个很简洁的思路:
step1:连接后面两个表,用窗口函数统计出每个用户的首次下单时间
rank() over(partition by uid order by event_time) as irank
注意:为什么不能用row_number()???因为后面两个表被连接,event_time被广播,下一步我要通过irank=1且event_time在2021年10月份来筛选用户,用row_number不能筛选出首单的全部明细!!!
select uid,
date(event_time) event_day,
total_amount,price,cnt,
rank() over(partition by uid order by event_time) as irank
from tb_order_overall t2
left join tb_order_detail t3
on t2.order_id = t3.order_id
step2:筛选出irank=1且event_time在2021年10月份的信息,并聚合求出实际付款金额和原总金额
select uid,sum(price*cnt) as raw_amount
,max(total_amount) total_amount
from(
select uid,
date(event_time) event_day,
total_amount,price,cnt,
rank() over(partition by uid order by event_time) as irank
from tb_order_overall t2
left join tb_order_detail t3
on t2.order_id = t3.order_id
)as t1
where irank = 1 and event_day between '2021-10-01' and '2021-10-31'
group by uid
step3:直接在上表聚合求解即可。
select round(avg(total_amount),1) as avg_amount
,round(avg(raw_amount-total_amount),1) as avg_cost
from(
select uid,sum(price*cnt) as raw_amount
,max(total_amount) total_amount
from(
select uid,
date(event_time) event_day,
total_amount,price,cnt,
rank() over(partition by uid order by event_time) as irank
from tb_order_overall t2
left join tb_order_detail t3
on t2.order_id = t3.order_id
)as t1
where irank = 1 and event_day between '2021-10-01' and '2021-10-31'
group by uid
)as t2



京公网安备 11010502036488号