WITH t AS (
SELECT
t3.order_id,
AVG(total_amount) AS sum_amount,
SUM(price * cnt) - AVG(total_amount) AS cost
FROM tb_order_detail t3
JOIN tb_order_overall t2 ON t3.order_id = t2.order_id
JOIN (
SELECT uid, MIN(event_time) first_time
FROM tb_order_overall
GROUP BY uid
)t1 ON t2.event_time = t1.first_time
WHERE DATE_FORMAT(event_time, '%Y-%m') = '2021-10'
GROUP BY t3.order_id
)
SELECT
ROUND(AVG(sum_amount), 1) AS avg_amount,
ROUND(AVG(cost), 1) AS avg_cost
FROM t
有两个地方是关键,一是在使用了GROUP BY的查询中不能直接查询没有聚合的列total_amount,所以在这里加上一个AVG把它包起来就可以了。二是如何判断“用户的首次购买”,这里采取的方法是连接一个查询“每个用户最小时间”的子查询表,连接条件是购买时间 = 最小时间。

京公网安备 11010502036488号