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
相关产品推荐
相关产品推荐

