我正在尝试在数据库中标记新客户和迷失客户。目的是要有一个非常简单的平板,在其中我可以为给定的业务和给定的年份拉“新客户”和“丢失客户”。
我有一个看起来像这样的表:
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中进行此操作,并且它是一个糟糕的编码器,并且对蛮力技术非常开放!
答案 0 :(得分:1)
使用Correlated Subqueries,条件为Exists()
的一种解决方案是可能的。
在第一个子查询中,我们为特定的YEAR
,BUSINESS
和CUSTOMER
组合确定是否存在上一个 YEAR
。如果它为exists()
,则将NEW
设置为NULL
(因为今年之前已经存在另一行)。
在第二个子查询中,我们确定对于特定的YEAR
,BUSINESS
和CUSTOMER
组合,是否存在任何以后 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