Включить в запрос SQL только состояния перехода - PullRequest
0 голосов
/ 30 октября 2018

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

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, где находятся мои данные, приводит к ошибке, сообщающей мне, что

Запрос исчерпанных ресурсов с этим масштабным коэффициентом

Есть ли способ сделать этот запрос более эффективным?

1 Ответ

0 голосов
/ 30 октября 2018

Это проблема пробелов и островков. Но самое простое решение использует lag():

select customer, shop, time
from (select t.*, lag(shop) over (partition by customer order by time) as prev_shop
      from t
     ) t
where prev_shop is null or prev_shop <> shop;
...