为什么PostgreSQL会返回比预期更多的行?

时间:2015-11-03 15:04:24

标签: sql postgresql aggregate

我接下来的表格(只显示了重要的列):

clients: id, created_at
orders: id, client_id, created_at

我正在尝试选择所有拥有1个订单的客户

SELECT c.phone, c.created_at, o.created_at
FROM clients c
JOIN orders o ON c.id = o.client_id
GROUP BY c.phone, c.created_at, o.created_at
HAVING COUNT(o.id) = 1

当我只有27,000个客户时,获得33k +行 我做错了什么? 我应该在SQL中更改什么?

2 个答案:

答案 0 :(得分:1)

您正在使用c.phone, c.created_at, o.created_at作为分组。该声明将创建这些值的唯一分组。如果客户有多个订单,它仍会返回多个值,因为您已在订单表中添加了created_at字段。

如果您从o.created_at中移除group by字段,并在select(例如MIN(o.created_at))中使用汇总功能,那么您应该好好去。

答案 1 :(得分:0)

详细信息和摘要范围之间的基本问题:您需要订单的详细信息(created_at),但您需要的订单由聚合事实确定(如果是o.id则计算)。将问题分解为两部分:哪个client_ids只使用orders表有1个订单,然后将clients表加入到该表中。

SELECT 
    c.phone, c.created_at, o.created_at
FROM 
    clients c
JOIN 
(
 Select
     id, client_id, created_at,
     count(id) over (partition by client_id) count_oid 
 From orders
 ) o 
ON c.id = o.client_id
WHERE o.count_oid = 1