如何在PostgreSQL中实现循环查询,一次性获取90天配送统计数据
核心实现思路
不用在PostgreSQL中写循环,直接用内置的generate_series函数动态生成未来90天的连续日期序列,代替你JS层循环调用的逻辑,一次性关联查询出所有结果:
- 无需额外维护静态配送日期表,日期序列随查询动态生成
- 单次查询即可返回全量数据,避免90次数据请求的IO开销
- 结果直接按日期聚合,无需JS层额外拼接处理
完整SQL示例
WITH future_delivery_dates AS ( -- 生成从当前日期开始的未来90天连续配送日期,如需从明天开始可把CURRENT_DATE改为CURRENT_DATE+1 SELECT generate_series( CURRENT_DATE, CURRENT_DATE + INTERVAL '89 days', INTERVAL '1 day' )::DATE AS delivery_date ) SELECT fdd.delivery_date, pt.product_name, COUNT(ot.order_id) AS delivery_quantity FROM future_delivery_dates fdd -- 关联订单表匹配对应配送日期的订单 LEFT JOIN order_table ot ON ot.scheduled_delivery_date = fdd.delivery_date -- 关联商品表获取商品名称 LEFT JOIN product_table pt ON ot.product_id = pt.product_id -- 关联客户表,匹配当日处于休假状态的客户 LEFT JOIN customer_table ct ON ot.customer_id = ct.customer_id AND ct.vacation_start_date <= fdd.delivery_date AND ct.vacation_end_date >= fdd.delivery_date -- 过滤掉休假客户的订单 WHERE ct.customer_id IS NULL -- 按日期、商品分组统计配送量 GROUP BY fdd.delivery_date, pt.product_name -- 按日期排序,返回结果可直接转为你需要的对象数组结构 ORDER BY fdd.delivery_date, pt.product_name;
可调整规则说明
- 若需要返回无配送记录的日期(对应商品数量为0),可将日期序列先和全量商品表做交叉关联,再左连订单表即可
- 若客户休假的存储逻辑不是起止日期格式,自行调整
customer_table的关联过滤条件即可
内容的提问来源于stack exchange,提问作者Mattias Inokuchi
相关产品推荐
相关产品推荐

