SQL: выбор товаров, которые покупатели не покупают ежедневно - PullRequest
0 голосов
/ 29 января 2019

У меня есть таблица, в которой ежедневно покупается клиент.Я пытаюсь получить список всех товаров, которые клиент не покупал ежедневно.

Дополнительные пояснения. Ниже приведена таблица

+------------+---------+------------+
| dt         | product | product_id |
+------------+---------+------------+
| 2019-01-01 | Milk    |          1 |
| 2019-01-02 | Bread   |          2 |
| 2019-01-03 | Butter  |          3 |
| 2019-01-04 | Beer    |          4 |
| 2019-01-05 | Salt    |          5 |
| 2019-01-06 | Sugar   |          6 |
+------------+---------+------------+

Я пытаюсь получить отчет оНе купленные товары на основе всего списка.

+------------+------------------------------+
| dt         | product_not_purchased        | 
+------------+------------------------------+
| 2019-01-01 | Bread,Butter,Beer,Salt,Sugar |
| 2019-01-02 | Milk,Butter,Beer,Salt,Sugar  |
| 2019-01-03 | Milk,Bread,Beer,Salt,Sugar   |
+------------+------------------------------+

Для простоты здесь приведены данные только для одного покупателя, и покупателем будет приобретен только один товар.Но даты не являются статичными, даты могут расти с нерегулярной частотой.

Пример запроса на один день:

select dt, product, product_id from
trans  where product_id not in (select distinct product_id
from trans where dt not in ( '2019-01-01'))
where dt = '2019-01-01';

Я пытаюсь продлить его на каждый день.Я пытался использовать CTE и разделы, но это не сработало.Однако я решил создать временную таблицу и использовать минус.Как мне решить эту проблему?Или временная таблица - лучшее решение?

SQL-запросы для создания таблицы и вставки значений.Я использую MySQL:

create table trans (dt date, product varchar(10), product_id int);


insert into trans values ('2019-01-01','Milk',1);
insert into trans values ('2019-01-02','Bread',2);
insert into trans values ('2019-01-03','Butter',3);
insert into trans values ('2019-01-04','Beer',4);
insert into trans values ('2019-01-05','Salt',5);
insert into trans values ('2019-01-06','Sugar',6);

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Используйте cross join для генерации всех продуктов на все дни.Затем отфильтруйте те, которые были приобретены, и объедините остальные:

select d.dt, group_concat(p.product)
from (select distinct dt from t) d cross join
     (select distinct product from t) p left join
     t
     on t.dt = d.dt and t.product = p.product
where t.product is null
group by d.dte;
0 голосов
/ 29 января 2019

Если у вас есть только таблица trans:

select dt, group_concat(product order by product) product_not_purchased from (
  select distinct t.dt, tt.product from trans t
  inner join trans tt
  on tt.dt <> t.dt
) t
group by dt

См. Демоверсию

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