SQL-запрос для группирования новых и старых клиентов ежемесячно - PullRequest
0 голосов
/ 27 сентября 2018

Я ищу запрос, который может подсчитывать новых и возвращающихся клиентов ежемесячно.

По сути, у меня есть данные за 2 года клиентов, которые обращались за кредитами, некоторые клиенты после первого займа вернулись через 1, 2, 3 ... x месяцев.Мне нужен запрос, который возвращает результат в следующем формате:

Month YY  |  New Customers  | Returning Customers
Jan '16   |       6         |        0
Feb '16   |       3         |        0
Mar '16   |       2         |        3
Apr '16   |       4         |        2

Некоторые полезные столбцы в моей таблице (имя таблицы: Ссуды ), которые, как мне кажется, будут полезны, включают: customer_id"," date_disbursed".

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

Например: Если customer_id: « 2231 » впервые появилось на столе в январе '16, его следует считать новым клиентом в январе '16, и еслион возвращается через 2 месяца, то есть в апреле '16 года, его следует считать возвращающим клиентом.

1 Ответ

0 голосов
/ 27 сентября 2018

Кажется, что-то подобное делает то, что вы хотите:

Настройка теста:

create table loans
(
  customer_id integer, 
  date_disbursed date
);

insert into loans
values
( 1, date '2016-01-01'),
( 2, date '2016-01-02'),
( 3, date '2016-01-04'),
( 4, date '2016-01-08'),
( 5, date '2016-01-12'),
( 6, date '2016-01-18'),
( 7, date '2016-02-08'),
( 8, date '2016-02-12'),
( 9, date '2016-03-18'),
(10, date '2016-03-12'),
(11, date '2016-03-18'),
( 3, date '2016-03-04'),
( 4, date '2016-03-08'),
( 5, date '2016-03-12'),
( 5, date '2016-04-12'),
(12, date '2016-04-12'),
( 5, date '2016-05-12'),
( 6, date '2016-05-18');

Запрос:

select to_char(date_disbursed, 'yyyy-mm') as month,
       count(*) filter (where new_customer) as new_customers,
       count(*) filter (where recurring_customer) as returning_customers
from (       
  select customer_id,
         date_disbursed, 
         date_disbursed = min(date_disbursed) over w as new_customer,
         date_disbursed > min(date_disbursed) over w as recurring_customer
  from loans
  window w as (partition by customer_id)
) t
group by to_char(date_disbursed, 'yyyy-mm')
order by to_char(date_disbursed, 'yyyy-mm');

возвращает

month   | new_customers | returning_customers
--------+---------------+--------------------
2016-01 |             6 |                   0
2016-02 |             2 |                   0
2016-03 |             3 |                   3
2016-04 |             1 |                   1
2016-05 |             0 |                   2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...