sql - выбрать все строки, имеющие несколько одинаковых столбцов - PullRequest
1 голос
/ 09 февраля 2020

У меня есть таблица с 4 столбцами.

  • дата
  • store_id
  • product_id
  • label_id

и мне нужно найти все store_id, у которых все products_id с одинаковым label_id (например, 4) за один день.

например:

store_id | label_id | product_id | data|
   4          4           5         9/2
   5          4           7         9/2
   4          3           12        9/2
   4          4           7         9/2   

, поэтому он должен вернуть 4, потому что это только магазин, который содержит все возможные продукты с меткой 4.

Я пробовал что-то вроде этого:

(select store_id, date
from table
where label_id = 4
group by store_id, date
order by date)

Я не знаю, как написать внешний запрос, я пытался:

select * from table
where product_id = all(Inner query)

но это не сработало.

Спасибо

Ответы [ 3 ]

2 голосов
/ 09 февраля 2020

Из вашего вопроса неясно, указываются ли метки c для данного дня или в течение всего периода. Но вариант ответа Тима кажется подходящим. Для любой ярлык:

SELECT t.date, t.label, t.store_id
FROM t
GROUP BY t.date, t.label, t.store_id
HAVING COUNT(DISTINCT t.product_id) = (SELECT COUNT(DISTINCT t2product_id)
                                       FROM t t2
                                       WHERE t2.label = t.label
                                      );

Для определенного ярлыка:

SELECT t.date, t.store_id
FROM t
WHERE t.label = 4
GROUP BY t.date,t.store_id
HAVING COUNT(DISTINCT t.product_id) = (SELECT COUNT(DISTINCT t2product_id)
                                       FROM t t2
                                       WHERE t2.label = t.label
                                      );

Если ярлыки указаны c для даты, то вам нужно это сравнение во внешних запросах.

1 голос
/ 09 февраля 2020

Вот один из способов:

SELECT date, store_id
FROM yourTable
GROUP BY date, store_id
HAVING COUNT(DISTINCT product_id) = (SELECT COUNT(DISTINCT product_id)
                                     FROM yourTable t2
                                     WHERE t2.date = t1.date)
ORDER BY date, product_id;

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

0 голосов
/ 09 февраля 2020

Я бы, вероятно, агрегировал списки товаров в строке или массиве:

with products_per_day_and_store as
(
  select
    store_id,
    date,
    string_agg(distinct product_id order by product_id) as products
  from mytable
  where label_id = 4
  group by store_id, date
)
, products_per_day
(
  select
    date,
    string_agg(distinct product_id order by product_id) as products
  from mytable
  where label_id = 4
  group by date
)
select distinct ppdas.store_id
from products_per_day_and_store ppdas
join products_per_day ppd using (date, products);
...