У меня есть стол заказов. К каждому заказу прикреплена дата и идентификатор клиента.
Я пытаюсь определить, сколько существует случаев, когда у клиента разрыв между заказами превышает 365 дней.
Мое решение заключается в следующем: присоединить таблицу заказов слева к себе, чтобы определить следующий заказ для пользователя; однако, это работает невероятно медленно и кажется очень неэффективным:
SELECT
COUNT(*)
FROM (
SELECT
transactions.customer_id,
transactions.transaction_date,
DATEDIFF(day, transactions.transaction_date, MIN(next_transactions.transaction_date)) days_to_next_transaction
FROM (
SELECT
customer_id,
transaction_date
FROM
transactions_table
) transactions
LEFT JOIN (
SELECT
customer_id,
transaction_date
FROM
transactions_table
) next_transactions
ON
transactions.customer_id = next_transactions.customer_id AND
transactions.transaction_date < next_transactions.transaction_date;
)
WHERE
days_to_next_transaction > 365
Теоретически я чувствую, что могу отсортировать список заказов по customer_id
, а затем transaction_date
. Отсюда мне нужно будет сделать только один проход из всех строк: я бы сравнил одну строку со строкой непосредственно под ней - если следующая строка будет иметь тот же customer_id, что и моя текущая строка, я вычислю дни до следующей транзакции как разница между датой в следующем столбце - текущей.
Есть ли способ реализовать это?