Исключение повторяющихся элементов из запроса с использованием 'group by' - PullRequest
1 голос
/ 21 июля 2010

У меня есть три таблицы:

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

Я хотел бы спросить, какие товары были доставлены какими партнерами за одну доставку клиенту. Иногда разные партнеры доставляют одни и те же предметы, которые должны быть отфильтрованы, так как доставленные предметы не содержат дубликатов.

Я придумал вот что:

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;

Тем не менее, это дает мне все доставленные вещи, включая обманщиков, которые доставили партнеры. Я долго об этом думал, и пытался отобрать, используя «кроме», «имея» и другие, но не достиг того, что привело меня дальше.

Буду рад любым подсказкам в правильном направлении. Спасибо.

- Правка -

Вот некоторые примеры данных:

таблица «получено»

partner_id | item_id 
-----------|---------
1          | 1
1          | 2
2          | 1
2          | 3

стол «доставлено»

item_id | delivery_date | customer_id
--------|---------------|------------
1       | 2010-07-14    | 1
2       | 2010-07-14    | 1
3       | 2010-07-14    | 1

Токовый выход:

partner | amount
--------|------
1       | 2
2       | 2

Желаемый вывод:

partner | amount
--------|------
1       | 2
2       | 1

Поскольку партнер с идентификатором 2 доставил товар, который уже был доставлен партнером 1.

Ответы [ 2 ]

1 голос
/ 21 июля 2010
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 учитывается для одного клиента, а не для другого?Почему это считается только для одного из них, если оба доставили его?

Вы можете попробовать это как:

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;
0 голосов
/ 21 июля 2010

У вас должна быть причина для назначения каждой доставки одному партнеру.В вашем примере вы, похоже, решили присвоить его более низкому номеру.Это можно сделать примерно так:

(выберите min (partner_id) partner_id, item_id из полученной группы по item_id) rec_assign

Затем добавьте partner_id партнера по доставке в доставленную таблицу:

(выберите доставлено. *, Rec_assign.partner_id из доставленного внутреннего соединения (выберите min (partner_id) partner_id, item_id из полученной группы на item_id) rec_assign для delivery.item_id = rec_assign.item_id)) как del_mod

Теперь все просто

выберите partner_id, count () из (выберите доставлено. , rec_assign.partner_id из доставленного внутреннего соединения (выберите min (partner_id) partner_id, item_id из полученной группы по item_id)) rec_assign для delivery.item_id = rec_assign.item_id)) в качестве группы del_mod по partner_id порядка по partner_id

Я думаю, что это должно быть сделано, по модулю глупых ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...