Есть ли лучший способ узнать, прошел ли заказчик «перерыв» в SQL? - PullRequest
0 голосов
/ 01 июля 2019

Я пытаюсь увидеть, сколько клиентов вернулось после двух лет бездействия. Я также должен объединить две таблицы со старыми (до 2008 года) и более новыми данными о закупках (после 2008 года). Каждая таблица имеет одинаковые столбцы, но разные записи.

Например, если Билл совершил покупку 1 июля 2010 года и больше ничего не покупал до 1 июля 2012 года, он будет засчитан. У каждой даты покупки есть свой столбец.

Мне предложили попробовать код, показанный ниже, но он очень медленный (у меня много записей). Мне было интересно, есть ли более эффективный способ сделать это.

(я использую Redshift)

FROM (SELECT s.cust_id, s.purchase_date,
             LAG(s.purchase_date) OVER (PARTITION BY s.cust_id ORDER BY s.purchase_date,) as prev_pd
      FROM newer_purchase_data s JOIN older_purchase_data l on s.cust_id = l.cust_id
     ) t
WHERE DATEDIFF(days, prev_pd, s.purchase_date) >= 730  /* 2 years in days */
;

1 Ответ

0 голосов
/ 01 июля 2019

в настоящее время вы вызываете соединение многих ко многим (я думаю), что приводит к вашей неэффективности.

Попробуйте эту структуру для своего запроса

select *
FROM (SELECT cust_id, purchase_date::timestamp,
             LAG(purchase_date::timestamp,1) OVER (PARTITION BY cust_id ORDER BY purchase_date) as prev_pd
          FROM 
           (select cust_id,purchase_date from older_purchase_data 
            union all
            select cust_id,purchase_date from newer_purchase_data 
           ) as x
         ) t
    WHERE DATEDIFF('day', prev_pd, purchase_date) >= 730  /* 2 years in days */
...