在时间序列数据库中标记差距和新条目-客户流失和新客户

时间:2018-11-09 16:42:01

标签: mysql database google-cloud-dataprep

我正在尝试在数据库中标记新客户和迷失客户。目的是要有一个非常简单的平板,在其中我可以为给定的业务和给定的年份拉“新客户”和“丢失客户”。

我有一个看起来像这样的表:

BUSINESS, CUSTOMER, YEAR
Business X, Customer A, 2001
Business X, Customer A, 2002
Business X, Customer A, 2003
Business X, Customer B, 2004
Business X, Customer B, 2005
Business Y, Customer A, 2004

我想在表中添加两个新列,以便我标记该年该客户是“ NEW”还是该业务第二年的“ GONE”。因此最终结果应如下所示:

BUSINESS, CUSTOMER, YEAR, NEW, GONE
Business X, Customer A, 2001, NEW, NULL
Business X, Customer A, 2002, NULL, NULL
Business X, Customer A, 2003, NULL, GONE
Business X, Customer B, 2004, NEW, NULL
Business X, Customer B, 2005, NULL, GONE
Business Y, Customer A, 2004, NEW, NULL

非常感谢您的帮助。我正在SQL中进行此操作,也在Google Cloud Dataprep中进行此操作,并且它是一个糟糕的编码器,并且对蛮力技术非常开放!

1 个答案:

答案 0 :(得分:1)

使用Correlated Subqueries,条件为Exists()的一种解决方案是可能的。

在第一个子查询中,我们为特定的YEARBUSINESSCUSTOMER组合确定是否存在上一个 YEAR。如果它为exists(),则将NEW设置为NULL(因为今年之前已经存在另一行)。

在第二个子查询中,我们确定对于特定的YEARBUSINESSCUSTOMER组合,是否存在任何以后 YEAR。如果它为exists(),则将GONE设置为NULL(因为今年之后已经存在另一行)。

SELECT 
 t1.BUSINESS, 
 t1.CUSTOMER, 
 t1.YEAR, 
 IF ( EXISTS(SELECT 1 
             FROM your_table AS t2 
             WHERE t2.BUSINESS = t1.BUSINESS AND 
                   t2.CUSTOMER = t1.CUSTOMER AND 
                   t2.YEAR < t1.YEAR 
             LIMIT 1), NULL, 'NEW' ) AS NEW, 
 IF ( EXISTS(SELECT 1 
             FROM your_table AS t3 
             WHERE t3.BUSINESS = t1.BUSINESS AND 
                   t3.CUSTOMER = t1.CUSTOMER AND 
                   t3.YEAR > t1.YEAR 
             LIMIT 1), NULL, 'GONE' ) AS GONE
FROM your_table AS t1