-1

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

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

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

而且我想在我的表中添加两个新列,以便我标记客户在那一年是“新”,还是在该业务线的下一年“离开”。所以最终结果应该是这样的:

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 进行这项工作,而且我是一个糟糕的编码员,并且对蛮力技术非常开放!

4

1 回答 1

1

一种解决方案是使用Correlated SubqueriesExists()有条件的。

在第一个子查询中,我们确定是否存在任何先前 YEAR的特定BUSINESS,CUSTOMERYEAR组合。如果是exists(),我们将其设置NEWNULL(因为在今年之前已经存在另一行)。

在第二个子查询中,我们确定特定的,和组合是否存在任何后续。 如果是,我们将其设置为(因为今年之后已经存在另一行)。YEARBUSINESSCUSTOMERYEARexists()GONENULL

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 
于 2018-11-09T18:12:00.663 回答