SQL并行周期(同期)查询无需使用UNION的实现方法咨询
无需UNION的同期对比SQL实现方案
方案1:单行两列返回(适配同比计算场景)
该方案将两个周期的统计结果放在同一行的不同列,方便直接计算同比增长率等指标,仅需扫描一次销售表,性能更优:
SELECT SUM(CASE WHEN date BETWEEN '2014-01-01' AND '2014-02-01' THEN Profit ELSE 0 END) AS current_period_profit, SUM(CASE WHEN date BETWEEN '2014-01-01' - INTERVAL 1 YEAR AND '2014-02-01' - INTERVAL 1 YEAR THEN Profit ELSE 0 END) AS last_year_same_period_profit FROM Sales WHERE (date BETWEEN '2014-01-01' AND '2014-02-01' OR date BETWEEN '2014-01-01' - INTERVAL 1 YEAR AND '2014-02-01' - INTERVAL 1 YEAR) AND <other_filters>
核心逻辑:放宽WHERE层的时间过滤范围,同时覆盖当前统计周期和往期对比周期,再通过CASE WHEN按时间归属条件分别做聚合求和。
方案2:两行返回(和原UNION ALL输出格式完全一致)
如果需要保留原UNION ALL返回两行的格式,可以用预定义时间区间关联聚合的方式实现:
SELECT SUM(s.Profit) AS period_profit FROM ( -- 可灵活扩展更多对比时间区间 VALUES ('2014-01-01', '2014-02-01'), ('2014-01-01' - INTERVAL 1 YEAR, '2014-02-01' - INTERVAL 1 YEAR) ) AS periods(start_date, end_date) JOIN Sales s ON s.date BETWEEN periods.start_date AND periods.end_date WHERE <other_filters> GROUP BY periods.start_date, periods.end_date ORDER BY periods.start_date DESC
核心逻辑:通过VALUES子句生成所有需要统计的时间区间维度表,和销售表关联后按区间分组聚合,后续新增对比周期仅需在VALUES列表中追加行即可,可维护性更高。
内容的提问来源于stack exchange,提问作者David542
相关产品推荐
相关产品推荐

