SQL查询每月对新客户和旧客户进行分组

时间:2018-09-27 11:11:10

标签: sql postgresql

我正在寻找一个可以每月统计新客户和回头客的查询。

基本上,我有一个超过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 ”,“ 已付款日期

“新客户”的定义是在给定月份首次出现在表格上的customer_id。 回头客户是一个customer_id,它在接下来的几个月中在表格的第一个日期之后出现多次。

例如:如果customer_id:“ 2231 ”于16年1月首次出现在表格中,则应将其视为16年1月的新客户,如果是在16个月(16年4月)之后的2个月内退货。

1 个答案:

答案 0 :(得分:2)

这种事情似乎可以满足您的要求:

测试设置:

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