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

如何让PostgreSQL识别重复日期以完成统计计算?

解决PostgreSQL中客户单日交易计数合并问题

你的问题出在多表JOIN后产生了重复记录,导致COUNT(*)统计的是JOIN后的重复行数,而非实际的交易次数。

修复后的查询方案一(推荐,避免不必要的JOIN)

如果只需要统计客户单日的租赁交易次数,不需要关联inventory和film表(除非你有特定的过滤需求),直接从rental表聚合即可:

SELECT
  customer_id,
  rental_date::date AS rental_date,
  COUNT(rental_id) AS count
FROM rental
GROUP BY customer_id, rental_date::date
ORDER BY customer_id, rental_date::date;

修复后的查询方案二(保留所有表关联)

如果必须保留inventory和film的关联(比如要筛选特定影片的交易),需要用COUNT(DISTINCT rental_id)来确保每笔唯一租赁只被计数一次:

SELECT
  c.customer_id,
  r.rental_date::date AS rental_date,
  COUNT(DISTINCT r.rental_id) AS count
FROM customer c
JOIN rental r ON c.customer_id = r.customer_id
JOIN inventory i ON r.inventory_id = i.inventory_id
JOIN film f ON i.film_id = f.film_id
GROUP BY c.customer_id, r.rental_date::date
ORDER BY c.customer_id, r.rental_date::date;

原因说明

你原来的查询中,COUNT(*)统计的是JOIN操作后产生的所有行。当rental与inventory、film关联时,同一笔租赁记录可能被匹配多次(比如关联逻辑导致的冗余),最终分组后同一客户同一天的交易被拆分成多条count=1的记录。使用COUNT(DISTINCT rental_id)会忽略重复的租赁记录,只统计唯一的交易次数;而直接从rental表聚合则从源头上避免了重复行的产生。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 12:25:34