Я изо всех сил пытаюсь создать запрос, выбирающий пользователей, которые ранее покупали другой продукт (который не тот, который они купили сейчас). Я хочу знать, сколько пользователей, купивших продукт Б, ранее купили продукт А.

Моя таблица выглядит так:

User ID | Product ID | Date 
      1 | B          | 2020/12/05
      2 | B          | 2020/12/04
      1 | A          | 2020/12/03
      3 | A          | 2020/12/03
      3 | B          | 2020/12/02
      4 | B          | 2020/12/02
      4 | B          | 2020/12/01

Результат должен быть равен 1, потому что пользователь 1 купил B после A. Пользователь 3 купил A после B и поэтому не учитывается. Пользователь 4 купил только продукт B и поэтому не учитывается.

Был бы очень рад, если бы вы смогли помочь!

0
Tobias 5 Дек 2020 в 16:20

1 ответ

Лучший ответ

Вы можете использовать агрегацию:

select count(*)
from (
    select user_id
    from mytable
    group by user_id
    having min(case when product_id = 'A' then date end)
         < max(case when product_id = 'B' then date end)
) t

В качестве альтернативы используется подзапрос и count(distinct):

select count(distinct user_id) 
from mytable t
where product_id = 'B' and exists (
    select 1 from mytable t1 where t1.user_id = t.user_id and t1.product_id = 'A' and t1.date < t.date
)
0
GMB 5 Дек 2020 в 13:30