SQL оператор для запроса новых покупателей по мере поступления - PullRequest
1 голос
/ 27 февраля 2020

В настоящее время у меня есть таблица заказов, которая выглядит следующим образом:

purchase_date | item_id | item_name | user_id
2/3/2020      | 123     | abc       | 987
3/3/2020      | 123     | abc       | 987
3/3/2020      | 123     | abc       | 876
3/3/2020      | 234     | bcd       | 987
...

Я пытался создать оператор SQL, который будет возвращать что-то подобное, выполняя подсчет (отличный user_id):

purchase_date | item_id | item_name | number of buyers new to item
2/3/2020      | 123     | abc       | 1 
3/3/2020      | 123     | abc       | 1
3/3/2020      | 234     | bcd       | 1

Конечно, в таблице заказов будет несколько item_ids.

Я пытаюсь добиться того, чтобы получить скользящее число покупателей, которые никогда не покупали этот конкретный c Элемент до в каждый день.

Например, на основе приведенного выше примера таблицы заказов, есть 1 покупатель один 2/3/2020 и 2 покупателя 3/3/2020. Однако User_id 987 купил этот же товар 3/3/2020, поэтому я не хочу считать этого пользователя, поэтому конечным результатом для 3/3/2020 должен быть только 1 пользователь.

User_id 987 будет все еще считается для item_id 234, так как этот пользователь не покупал этот элемент ранее в таблице заказов.

Элементы в таблице заказов будут обновляться каждый понедельник, поэтому я пытаюсь создать запрос, который будет ежедневно и возвращаться меняются постоянные числа покупателей, которые являются новыми для каждого конкретного элемента c (т.е. не покупали его раньше) с понедельника по воскресенье.

Это концепция использования CROSS JOIN, или временных таблиц, так или иначе, или это более сложная идея, чем я ожидал, для выполнения ее в SQL формате запроса?

Спасибо!

1 Ответ

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

Используйте два уровня агрегации:

select first_pd, item_id, item_name, count(*) as num_first_purchases
from (select user_id, item_id, item_name, min(purchase_date) as first_pd
      from t
      group by user_id, item_id, item_name
     ) ui
group by first_pd, item_id, item_name
order by first_pd, item_id, item_name;
...