首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么PostgreSQL返回的行比预期的多?

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

Stack Overflow用户
提问于 2015-11-03 15:04:23
回答 2查看 179关注 0票数 0

我有下一个表(只显示了重要的列):

代码语言:javascript
复制
clients: id, created_at
orders: id, client_id, created_at

我试着选择所有有一个订单的客户端。

代码语言:javascript
复制
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

当我只有27k个客户端时,获取33k+行。

我做错了什么?

我应该在SQL中更改什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-03 15:10:48

您正在使用c.phone, c.created_at, o.created_at作为分组。这一声明将为这些价值建立独特的分组。如果客户端有多个订单,它仍然会返回多个值,因为您已经从orders表中包含了created_at字段。

如果将o.created_at字段从group by中移除,并在select (例如MIN(o.created_at))中对其使用聚合函数,则应该可以选择。

票数 1
EN

Stack Overflow用户

发布于 2015-11-03 15:31:49

细节和摘要范围之间的基本问题:您需要订单的详细信息(created_at),但是您想要的顺序是由和聚合事实决定的(如果算上o.id)。将问题分成两部分:哪个client_ids只使用orders表就有一个订单,然后将客户端表加入到其中。

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33502375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档