You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 07:54:03