我有一个看起来像这样的表格:
customer_id purchase_date category
1 9/1/2018 Electronics
1 9/2/2018 Art
1 9/3/2018 Books
1 9/5/2018 CPG
2 9/2/2018 Books
2 9/4/2018 Electronics
2 9/20/2018 CPG
从这里,我试图获取 CPG 购买之前的最近购买情况。为了进一步解释,这是我的步骤:
步骤 1. 创建不属于 CPG 类别的采购表:
WITH OTHERS AS(
SELECT customer_id,
category as others_category,
purchase_date
FROM orders o
WHERE category IN ('Electronics', 'Books', 'Art')
),
步骤 2. 创建 CPG 类别的采购表:
CPG AS(
SELECT customer_id,
category as cpg_category,
purchase_date
FROM orders o
WHERE category = 'CPG'
)
第3步.左连接: 这就是我被困住的地方。我想生成一个表,其中包含 CPG 购买之前最近的其他购买。即,输出应如下所示:
others_category count_distinct_customers
Electronics 1
Books 1
理想情况下我不想使用 CTE。 SQL类型是SQL Server 2017。
最佳答案
这就是我在 SQL Server 2017 中的做法,但是,我不确定这在 2005 年是否有效(不幸的是,就像我说的,我不再有 2005 年的测试环境)。我认为APPLY
是在SQL Server 2008中添加的。当然,“VTE”在2005年不起作用,因为添加了VALUES
构造函数子句然而,在 2008 年(如果我没记错的话),您至少将有一个可以测试的表:
WITH VTE AS(
SELECT V.customer_id,
CONVERT(date,V.purchase_date,101) AS purchase_date,
V.category
FROM (VALUES(1,'9/1/2018 ','Electronics'),
(1,'9/2/2018 ','Art'),
(1,'9/3/2018 ','Books'),
(1,'9/5/2018 ','CPG'),
(2,'9/2/2018 ','Books'),
(2,'9/4/2018 ','Electronics'),
(2,'9/20/2018','CPG')) V(customer_id,purchase_date,category))
SELECT V2.category,
COUNT(DISTINCT V2.customer_id) AS DistinctCustomers
FROM VTE V1
CROSS APPLY (SELECT TOP 1
customer_id,
purchase_date,
category
FROM VTE ca
WHERE ca.customer_id = V1.customer_id
AND ca.purchase_date < V1.purchase_date
ORDER BY ca.purchase_date DESC) V2
WHERE V1.category = 'CPG'
GROUP BY V2.category;
关于sql - 在最近一次购买之前选择最近一次购买,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55244412/