PostgreSQL中如何在同一查询中统计多个时间窗口的订单量
多时间区间订单量统计方案
完全可以在单条查询中完成所有区间的统计,最常用的实现方式是条件聚合,无需拆分多条查询或用UNION拼接结果。
方案1:横向展示(所有指标同一行输出)
优先推荐该写法,性能更高,无需多次关联原表:
SELECT -- 统计过去1天订单量 COUNT(CASE WHEN date(Order_Date) >= current_date - INTERVAL '1' day THEN Order_number END) AS last_1d_orders, -- 统计过去2天订单量 COUNT(CASE WHEN date(Order_Date) >= current_date - INTERVAL '2' day THEN Order_number END) AS last_2d_orders, -- 统计过去5天订单量 COUNT(CASE WHEN date(Order_Date) >= current_date - INTERVAL '5' day THEN Order_number END) AS last_5d_orders, -- 统计过去30天订单量 COUNT(CASE WHEN date(Order_Date) >= current_date - INTERVAL '30' day THEN Order_number END) AS last_30d_orders FROM 你的销售表名称 -- 提前过滤最大时间区间,减少全表扫描,大幅提升查询性能 WHERE date(Order_Date) >= current_date - INTERVAL '30' day;
小提示:如果使用MySQL等支持
IF函数的SQL引擎,可以将CASE WHEN替换为更简洁的IF写法:COUNT(IF(date(Order_Date) >= current_date - INTERVAL 1 day, Order_number, NULL))
方案2:纵向展示(每个时间区间单独一行输出)
如果需要输出为「区间名称-订单量」的结构化列表方便报表使用,可以用区间配置CTE关联统计:
WITH stat_intervals AS ( -- 配置你需要统计的所有时间区间,后续新增区间只要在这里加一行即可 SELECT 1 AS days, '过去1天' AS interval_name UNION ALL SELECT 2 AS days, '过去2天' AS interval_name UNION ALL SELECT 5 AS days, '过去5天' AS interval_name UNION ALL SELECT 30 AS days, '过去30天' AS interval_name ) SELECT t.interval_name, COUNT(o.Order_number) AS order_count FROM stat_intervals t LEFT JOIN 你的销售表名称 o ON date(o.Order_Date) >= current_date - INTERVAL (t.days) day GROUP BY t.interval_name, t.days ORDER BY t.days ASC;
内容的提问来源于stack exchange,提问作者pouchewar
相关产品推荐
相关产品推荐

