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

PostgreSQL租赁客户数据模型三类SQL查询需求求解

你的第3条SQL存在的问题
  • 未按照要求使用Date Series生成2019年6月的完整日期序列,会遗漏当日无新增租赁的日期,最终统计结果会缺行
  • 统计逻辑不符合需求:你当前统计的是当日新生成的租赁单数量,而需求要求的是「当日处于租赁周期内的所有活跃租赁单总数」,判断标准是租赁起始日≤当天≤归还日,和租赁单生成时间是否在当月没有直接关系
需求1:查询最近XY天内有租赁起始记录的客户列表
-- 替换XY为实际天数,比如最近7天就写7
SELECT DISTINCT c.*
FROM customer c
INNER JOIN rental r ON c.customer_id = r.customer_id
WHERE r.rental_date >= CURRENT_DATE - INTERVAL '1 day' * XY;

逻辑说明:用DISTINCT对客户去重,避免同一客户有多条租赁记录时重复出现在结果中,时间筛选匹配租赁起始时间在最近XY天区间内的记录即可。

需求2:查询最近XY个月内,租赁过'category'分类下的商品且租赁订单数超过XY单的客户

注:以下语句默认表结构和PostgreSQL官方示例sakila库一致,租赁表rental关联库存表inventory,库存表关联分类表category

-- 第一处XY替换为月份数,第二处XY替换为最低订单数,'category'替换为实际分类名称
SELECT c.customer_id, c.customer_name, COUNT(r.rental_id) AS order_count
FROM customer c
INNER JOIN rental r ON c.customer_id = r.customer_id
INNER JOIN inventory i ON r.inventory_id = i.inventory_id
INNER JOIN category cat ON i.category_id = cat.category_id
WHERE 
  r.rental_date >= CURRENT_DATE - INTERVAL '1 month' * XY
  AND cat.category_name = 'category'
GROUP BY c.customer_id, c.customer_name
HAVING COUNT(r.rental_id) > XY;

逻辑说明:先筛选时间范围和商品分类的租赁记录,按客户维度分组后,通过HAVING子句过滤出订单数符合要求的客户。

需求3:统计2019年6月每一天的活跃租赁单数量(使用Date Series实现)
SELECT
  dt.stat_date,
  COUNT(r.rental_id) AS active_rental_count
FROM
  -- 生成2019年6月完整的连续日期序列
  generate_series(
    '2019-06-01'::DATE,
    '2019-06-30'::DATE,
    '1 day'::INTERVAL
  ) AS dt(stat_date)
LEFT JOIN rental r
  -- 匹配所有当日处于活跃状态的租赁单
  ON dt.stat_date >= r.rental_date::DATE
  AND dt.stat_date <= COALESCE(r.return_date, '9999-12-31'::DATE)
GROUP BY dt.stat_date
ORDER BY dt.stat_date;

逻辑说明:generate_series函数生成2019年6月全部30天的连续日期,保证不会遗漏无活跃订单的日期;COALESCE用于处理未归还的租赁单(如果return_date字段不为空可直接删除该函数替换为r.return_date::DATE),左连接匹配所有符合活跃规则的租赁单后按日期分组统计即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 19:15:01