У меня есть таблица с клиентами и их покупательским поведением, которая выглядит следующим образом:
customer shop time
----------------------------
1 5 13.30
1 5 14.33
1 10 22.17
2 3 12.15
2 1 13.30
2 1 15.55
2 3 17.29
Так как я хочу смену в магазине, мне нужен следующий вывод
customer shop time
----------------------------
1 5 13.30
1 10 22.17
2 3 12.15
2 1 13.30
2 3 17.29
Я пытался использовать
ROW_NUMBER() OVER (PARTITION BY customer, shop ORDER BY time ASC) AS a counter
и только потом сохраняя все counter=1
. Однако меня это беспокоит, когда покупатель снова посещает тот же магазин позже, как с customer=2
и shop=3
в моем примере.
Я придумал это:
WITH a AS
(
SELECT
customer, shop, time,
ROW_NUMBER() OVER (PARTITION BY customer ORDER BY time ASC) AS counter
FROM
db
)
SELECT a1.*
FROM a a1
JOIN a AS a2 ON (a1.device = a2.device AND a2.counter1 + 1 = a1.counter1 AND a2.id <> a1.id)
UNION
SELECT a.*
FROM a
WHERE counter1 = 1
Однако это очень неэффективно, и запуск его в AWS, где находятся мои данные, приводит к ошибке, сообщающей мне, что
Запрос исчерпанных ресурсов с этим масштабным коэффициентом
Есть ли способ сделать этот запрос более эффективным?