Логика запросов для выявления новых и постоянных клиентов - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь найти лучший способ написать запрос, который поможет мне определить клиентов, которые являются новыми в этом месяце, НО ТАКЖЕ старые клиенты, которые в последний раз заключали с нами сделку три месяца назад, но только что вернулись в этом месяце.1002 *

любая помощь или точка в правильном направлении будет принята с благодарностью.

заранее большое спасибо.

Best,

Ответы [ 3 ]

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

с использованием подзапроса - выбирает 3-месячного клиента и клиента текущего месяца, затем завершает соединение с 3-месячным клиентом с текущим месяцем, если оба клиента совпадают, то это старый клиент, в противном случае новый

with t1 as
    ( select s.* from from shipments s
      left join shipment_stops ss on ss.customer_id = s.customer_id)
    where date_trunc('month',customer_first_date)<= date_trunc('month',CURRENT_DATE - INTERVAL '3 months')
    ) , t2 as
 (
   select s.* from from shipments s
      left join shipment_stops ss on ss.customer_id = s.customer_id)
    where date_trunc('month',customer_first_date)>= date_trunc('month',now())
 ) select case when t2.customer_id=t1.customer_id then 'old customer'
   else 'new customer who comes this month' end customer_status
     left join t1
  on t2.customer_id =t1.customer_id
0 голосов
/ 19 октября 2018

Найдите всех клиентов с транзакциями в этом месяце (используя подзапрос exists) и некоторую условную агрегацию, чтобы различать новые и возвращаемые:

SELECT
    customer_id
  , CASE
        WHEN prev_max_dt < (current_date - '3 month'::INTERVAL)
        THEN 'Returning'
        ELSE 'New'
    END
FROM (
    SELECT
        ss.customer_id
      , MAX(CASE
            WHEN ss.tran_date < date_trunc('month', current_date) THEN ss.tran_date
        END) AS prev_max_dt
    FROM shipment_stops ss
    WHERE EXISTS (
        SELECT NULL
        FROM shipment_stops
        WHERE tran_date >= date_trunc('month', current_date)
        AND customer_id = ss.customer_id
        )
    GROUP BY
        ss.customer_id
) d
0 голосов
/ 18 октября 2018

Вы ссылаетесь на самый последний месяц, поэтому посмотрите на последнюю транзакцию в предложении having, а затем на самую раннюю в select:

select s.customer_id,
       (case when min(ss.tran_date) >= date_trunc('month', now()) 
             then 'New'
             else 'Existing'
        end) as grouping
from shipments s left join
     shipment_stops ss
     on ss.customer_id = s.customer_id 
group by s.customer_id
having max(ss.tran_date) >= date_trunc('month', now()) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...