sql - 在最近一次购买之前选择最近一次购买

标签 sql sql-server sql-server-2017

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

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/

相关文章:

pdf - 如何在MSSQL Server 2017中使用Adobe iFilter 11

sql-server - 使用 T-SQL 在 Linux 上获取 sql server 默认备份文件夹

sql-server - "CLR Integration"是否在数据库级别或服务器/实例级别启用?

sql - 如何找到每个经理下的所有员工

Mysql 表之间的关系 - 决定因素

php - SQL SELECT 到多个表

sql - 直接从另一个数据库还原 SQL Server 数据库

sql-server - SQL Server : get all data from one table but condition on 2nd tables column

php - 有没有更高效的更新数据库值的方法?

sql - TSQL 尝试清理杂乱的字符串字段并将其转换为小数以执行 SUM 函数