如何查询30天未下单客户并显示其最后下单日期
解决方案
你可以通过左连接聚合后的购买记录表,或者在SELECT子句中使用标量子查询来获取每个客户的最后一次购买日期,同时保留原查询的过滤逻辑。以下是两种可行的实现方式:
方法一:使用LEFT JOIN和聚合查询
先对购买记录表按客户分组计算最后购买日期,再与客户表左连接,最后过滤出过去30天无购买记录的客户:
SELECT c.customer_id, c.first_name, c.last_name, p.last_purchase_date FROM customers c LEFT JOIN ( SELECT customer_id, MAX(purchase_date) AS last_purchase_date FROM purchases GROUP BY customer_id ) p ON c.customer_id = p.customer_id WHERE p.last_purchase_date < TRUNC(SYSTIMESTAMP) - NUMTODSINTERVAL(30, 'DAY') OR p.last_purchase_date IS NULL;
方法二:使用标量子查询
直接在SELECT子句中嵌入子查询获取每个客户的最后购买日期,保留原有的NOT EXISTS过滤逻辑:
SELECT c.*, (SELECT MAX(purchase_date) FROM purchases p WHERE p.customer_id = c.customer_id) AS last_purchase_date FROM customers c WHERE NOT EXISTS ( SELECT 1 FROM purchases p WHERE c.customer_id = p.customer_id AND p.PURCHASE_DATE >= TRUNC(SYSTIMESTAMP) - NUMTODSINTERVAL (30, 'DAY') AND p.PURCHASE_DATE < TRUNC(SYSTIMESTAMP) );
说明
- 两种方法都会返回过去30天无购买记录的客户,
last_purchase_date列显示其最后一次购买时间;若客户从未下单,则该列值为NULL。 - 方法一的聚合查询一次性计算所有客户的最后购买日期,数据量较大时效率更优;方法二写法更简洁,适合小型数据集。
内容的提问来源于stack exchange,提问作者Pugzly
相关产品推荐
相关产品推荐

