Агрегирование данных первого заказа для всех заказов - Microsoft SQL Server - PullRequest
1 голос
/ 03 июля 2019

Это для Microsoft SQL Server.

Я пытаюсь выбрать первую покупку для каждого клиента в таблице, подобной этой:

transaction_no  customer_id  operator_id  purchase_date
20503           1            5            2012-08-24
20504           1            7            2013-10-15
20505           2            5            2013-09-05
20506           3            7            2010-09-06
20507           3            7            2012-07-30

Ожидаемый результат от запроса, который мы пытаемся достичь:

first_transaction_no  customer_id  operator_id  purchase_date first_purchase
20503                 1            5            2012-08-24    2012-08-24
20503                 1            7            2013-10-15    2012-08-24
20505                 2            5            2013-09-05    2013-09-05
20506                 3            7            2010-09-06    2010-09-06
20506                 3            7            2012-07-30    2010-09-06

Наиболее близким является следующий запрос:

SELECT a.customer_id, MIN(a.purchase_date) As first_occurence
FROM Sales_Transactions_Header as a
GROUP BY a.customer_id;

Со следующим результатом:

customer_id  first_occurence
1            2012-08-24
2            2013-09-05
3            2010-09-06

Но когда мы выбираем остальные необходимые поля, мы, очевидно, должны добавить их в предложение GROUP BY, что сделает результат от MIN другим. Мы также пытались присоединиться к ней самостоятельно, но не достигли никакого прогресса.

По сути, все, что я пытаюсь сделать, это добавить данные из начального заказа MIN к идентификатору клиента, чтобы при каждом заказе я также мог получать данные из их первоначального заказа. В этом примере этой информацией является дата их первой покупки и номер их первой транзакции.

Как получить остальные коррелированные значения, не путая агрегатную функцию?

1 Ответ

2 голосов
/ 03 июля 2019

Используйте функции окна:

SELECT sth.*,
       MIN(purchase_date) OVER (PARTITION BY customer_id) As first_occurence
FROM Sales_Transactions_Header sth;

РЕДАКТИРОВАТЬ:

Если вы хотите первую строку покупки для каждого клиента, то я бы порекомендовал коррелированный подзапрос:

select sth.*
from Sales_Transactions_Header sth
where sth.purchase_date = (select min(sth2.purchase_date)
                           from Sales_Transactions_Header sth2
                           where sth2.customer_id = sth.customer_id
                          );
...