SQL新手求助:如何对比商户前一日营收数据?
解决方案
首先,我们需要分步处理问题,先计算商户每日营收,再对比前一日数据,最后筛选出符合条件的商户:
完整SQL代码
WITH daily_merchant_revenue AS ( -- 第一步:计算每个商户每日的总营收,四舍五入到两位小数 SELECT DATE(order_timestamp) AS order_date, od.merchant_id, ROUND(SUM(od.amount), 2) AS daily_revenue FROM order_details od GROUP BY DATE(order_timestamp), od.merchant_id ), daily_revenue_with_prev AS ( -- 第二步:获取每个商户前一日的营收 SELECT order_date, merchant_id, daily_revenue, LAG(daily_revenue) OVER (PARTITION BY merchant_id ORDER BY order_date) AS prev_day_revenue FROM daily_merchant_revenue ), qualified_merchants AS ( -- 第三步:筛选出当日营收高于前一日的商户,且排除无前置数据的日期 SELECT order_date, merchant_id, daily_revenue FROM daily_revenue_with_prev WHERE prev_day_revenue IS NOT NULL AND daily_revenue > prev_day_revenue ), daily_max_revenue AS ( -- 第四步:找出每日符合条件商户中的最高营收值 SELECT order_date, MAX(daily_revenue) AS max_revenue FROM qualified_merchants GROUP BY order_date ) -- 第五步:关联商户表获取名称,输出结果 SELECT qm.order_date, md.name FROM qualified_merchants qm JOIN daily_max_revenue dmr ON qm.order_date = dmr.order_date AND qm.daily_revenue = dmr.max_revenue JOIN merchant_details md ON qm.merchant_id = md.id ORDER BY qm.order_date;
代码解释
- daily_merchant_revenue:按日期和商户分组,计算每日营收并四舍五入到两位小数。
- daily_revenue_with_prev:使用
LAG()窗口函数,为每个商户的每日营收匹配前一日的营收值(PARTITION BY merchant_id确保只对比同一商户的历史数据)。 - qualified_merchants:过滤出当日营收高于前一日的商户,同时排除没有前一日数据的记录(
prev_day_revenue IS NOT NULL)。 - daily_max_revenue:统计每日符合条件商户中的最高营收金额,用于后续筛选当日Top商户。
- 最终查询:关联符合条件的商户和每日最高营收数据,再关联商户表获取名称,按日期排序输出。
注意事项
- 假设
order_details表包含merchant_id字段关联商户表(你原代码中的order_details.id = merchant_details.id应为笔误,需调整为商户ID关联)。 - 如果题目要求的是"当日营收高于前一日全平台最高营收",逻辑会略有不同,但根据问题描述,这里默认是对比商户自身的前一日营收。
内容的提问来源于stack exchange,提问作者TryingItOut
相关产品推荐
相关产品推荐

