首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用'group by‘从查询中排除重复项

使用'group by‘从查询中排除重复项
EN

Stack Overflow用户
提问于 2010-07-21 21:50:36
回答 2查看 351关注 0票数 1

我有三张表:

代码语言:javascript
运行
复制
table 'received'
------------------
partner_id int
item_id int

table 'delivered'
------------------
item_id int
delivery_date date
customer_id int

table 'partners'
------------------
id int
name text

table 'customers'
------------------
id int
name text

我想要查询的是,哪些项目已经由哪些合作伙伴在一次交付中交付给了客户。有时,不同的合作伙伴交付相同的项目,这些项目应该被过滤掉,因为交付的项目不包含副本。

我的想法是这样的:

代码语言:javascript
运行
复制
select 
  partner_id, 
  count(distinct item_id) 
from 
  received 
where item_id in 
  (select distinct item_id from delivered where delivery_date = '2010-07-14' and customer_id = 1)
group by partner_id;

然而,这为我提供了所有交付的项目,包括合作伙伴交付的受骗项目。我已经考虑这个问题很长一段时间了,并尝试了使用'except',‘have’和其他的分项选择,但还没有达到让我更进一步的地步。

如果有任何正确方向的提示,我将不胜感激。谢谢。

-编辑--

以下是一些示例数据:

表‘已接收’

代码语言:javascript
运行
复制
partner_id | item_id 
-----------|---------
1          | 1
1          | 2
2          | 1
2          | 3

表'delivered‘

代码语言:javascript
运行
复制
item_id | delivery_date | customer_id
--------|---------------|------------
1       | 2010-07-14    | 1
2       | 2010-07-14    | 1
3       | 2010-07-14    | 1

当前输出为:

代码语言:javascript
运行
复制
partner | amount
--------|------
1       | 2
2       | 2

所需的输出为:

代码语言:javascript
运行
复制
partner | amount
--------|------
1       | 2
2       | 1

因为ID为%2的合作伙伴已交付已由合作伙伴% 1交付的项目。

EN

回答 2

Stack Overflow用户

发布于 2010-07-21 21:57:52

代码语言:javascript
运行
复制
select 
  partner_id, count(distinct item_id) 
from 
  received join delivered using (item_id)
where 
  delivery_date = '2010-07-14' and customer_id = 1
group by partner_id;

更新后,您的问题似乎没有得到很好的定义。为什么项目1计入一个客户而不计入另一个客户?如果两个人都交付了,为什么只计算其中一个呢?

你可以像这样试一下:

代码语言:javascript
运行
复制
select 
  partner_id, count(distinct item_id) 
from (
  select distinct on (item_id) partner_id, item_id
  from received join delivered using (item_id)
  where delivery_date = '2010-07-14' and customer_id = 1
  order by item_id, partner_id
)
group by partner_id;
票数 1
EN

Stack Overflow用户

发布于 2010-07-21 23:11:27

您必须有一个将每个交付分配给一个合作伙伴的原因。在您的示例中,您似乎已决定将其分配给较低的数字。你可以这样做:

(select min(partner_id) partner_id,item_id from received group on item_id) rec_assign

然后将交付合作伙伴的partner_id添加到已交付表中:

(select Delified.*,rec_assign.partner_id from delivered内联接(select min(partner_id) partner_id,item_id from received group on item_id) rec_assign on delivered.item_id = rec_assign.item_id) ) as del_mod

现在很简单了

select partner_id,count() from (select Delified.,rec_assign.partner_id from delivered内连接(select min( partner_id ) partner_id,item_id from received group on item_id) rec_assign on delivered.item_id = rec_assign.item_id) ) as del_mod group by partner_id order by partner_id

我认为这应该可以做到这一点,模愚蠢的错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3299941

复制
相关文章

相似问题

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