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

PostgreSQL如何实现跨多月查询同时存在于当月及过去12个月的用户

解决方案

你可以通过动态计算每个订单对应月份的历史校验区间,实现一次性查询任意多月的符合条件记录,参考SQL如下:

SELECT
    c1.order_date,
    c1.customer
FROM customers c1
-- 限定需要查询的目标月份范围,示例为2021年5月到6月,可按需调整
WHERE c1.order_date >= '2021-05-01' 
  AND c1.order_date < '2021-07-01'
  -- 动态校验用户当前订单月份往前12个月内是否有订单
  AND EXISTS (
      SELECT 1 FROM customers c2
      WHERE c2.customer = c1.customer
        AND c2.order_date >= DATE_TRUNC('month', c1.order_date) - INTERVAL '12 months'
        AND c2.order_date < DATE_TRUNC('month', c1.order_date)
  )
ORDER BY c1.order_date;

逻辑说明

  • 借助PostgreSQL内置的DATE_TRUNC函数可以动态获取任意订单所属月份的第一天,自动生成对应往前推12个月的历史校验区间,无需手动为每个月单独设置时间范围,天然支持跨多月查询
  • 日期判断采用>=和<的组合写法,避免了不同月份天数差异、时间戳精度带来的边界错误,比BETWEEN适用性更强
  • 执行上述SQL得到的结果和你给出的期望输出完全一致

优化建议

如果数据量较大,建议为customers表创建(customer, order_date)联合索引,可大幅降低子查询的检索开销,提升查询效率。

内容的提问来源于stack exchange,提问作者Michi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 02:45:01