题解 | 分析每个商品在不同时间段的销售情况
分析每个商品在不同时间段的销售情况
https://www.nowcoder.com/practice/eec7a93e1ab24233bd244e04e910d2f9
--版本1 with new_order_info as ( select * from order_info where year(order_date) = 2024 and month(order_date) in (4, 5, 6) ), temp as ( select product_id, product_name, category, order_id, order_date, total_amount, supplier_id, supplier_name from product_info left join new_order_info using (product_id) join supplier_info using (product_id) ), temp2 as ( select product_id, product_name, category, if(sum(total_amount) is null, 0, sum(total_amount)) as q2_2024_sales_total, supplier_name from temp group by product_id, product_name, category, supplier_name ) select product_id, product_name, q2_2024_sales_total, rank() over ( partition by category order by q2_2024_sales_total desc ) as category_rank, supplier_name from temp2 order by product_id asc --版本2 WITH q2_2024_orders AS ( SELECT product_id, SUM(total_amount) AS q2_2024_sales_total FROM order_info WHERE order_date >= '2024-04-01' AND order_date < '2024-07-01' GROUP BY product_id ) SELECT p.product_id, p.product_name, COALESCE(o.q2_2024_sales_total, 0) AS q2_2024_sales_total, RANK() OVER (PARTITION BY p.category ORDER BY COALESCE(o.q2_2024_sales_total, 0) DESC) AS category_rank, s.supplier_name FROM product_info p LEFT JOIN q2_2024_orders o ON p.product_id = o.product_id JOIN supplier_info s ON p.product_id = s.product_id ORDER BY p.product_id ASC;
对比两个版本
1. 不必要的中间步骤
- 你创建了
new_order_info
临时表,只是简单筛选了日期,但后续又立即在temp
中与其它表连接。这个中间步骤可以合并。 temp
和temp2
两个临时表其实可以合并为一个步骤。
2. 过于复杂的NULL值处理
if(sum(total_amount) is null, 0, sum(total_amount))
这种写法有些冗余- 可以直接用
COALESCE(SUM(total_amount), 0)
更简洁
3. 日期筛选方式不够高效
year(order_date) = 2024 and month(order_date) in (4, 5, 6)
- 这种写法会导致索引失效(如果存在),直接使用日期范围更高效
4. 连接操作可以更直接
- 你在
temp
中先左连接product_info和new_order_info,然后又内连接supplier_info - 这种多步连接可以简化为一步完成
5. 字段选择过于详细后又丢弃
- 在
temp
中选择了许多字段(order_id, order_date等),但在temp2
中又丢弃了它们 - 应该只选择最终需要的字段
6. GROUP BY字段过多
- 在
temp2
中GROUP BY了product_id, product_name, category, supplier_name - 实际上product_name和category通常由product_id决定,可能不需要全部列出
7. 使用了USING而不是ON
USING
语法虽然简洁,但在复杂查询中不如ON
清晰明确
这些"啰嗦"的地方虽然不影响查询结果,但会影响:
- 查询的可读性
- 执行效率(特别是大数据量时)
- 维护的便利性
简化后的版本去掉了这些冗余,逻辑更直接,执行路径更清晰。