如何关联返回单条结果的子查询?查询客户最新购买记录
用JOIN实现获取所有客户及最新购买记录的方案
没问题,这需求很常见,我来一步步帮你搞定。
首先咱们得明确核心目标:既要返回所有客户的基础信息,又要匹配到每位客户最近的那笔购买记录。用JOIN的方式来做的话,核心思路是先找出每个客户的最新购买日期,再通过这个日期关联回销售表,拿到对应的订单详情。
步骤1:先获取每个客户的最新购买日期
咱们可以先写个子查询,按客户ID分组,找出每个客户的最大购买日期(也就是最新的那笔):
SELECT CustID, MAX(DatePurchase) AS LatestPurchaseDate FROM Sales GROUP BY CustID
这个子查询会生成一个临时结果集,每个客户ID对应它的最新购买日期。
步骤2:关联客户表、临时结果集和销售表
接下来用LEFT JOIN把三个部分关联起来,确保哪怕没有购买记录的客户也能被包含进来:
SELECT c.[Cust ID], c.[Cust Name], s.DatePurchase AS LatestPurchaseDate, s.Amount AS LatestPurchaseAmount FROM Customers c -- 关联每个客户的最新购买日期 LEFT JOIN ( SELECT CustID, MAX(DatePurchase) AS LatestPurchaseDate FROM Sales GROUP BY CustID ) latest_sales ON c.[Cust ID] = latest_sales.CustID -- 通过客户ID+最新日期关联回销售表,拿到对应的订单金额 LEFT JOIN Sales s ON latest_sales.CustID = s.CustID AND latest_sales.LatestPurchaseDate = s.DatePurchase
补充说明
- 用
LEFT JOIN而不是INNER JOIN的原因:这样没有任何购买记录的客户也会出现在结果里,对应的购买日期和金额会显示为NULL,完全符合你“返回所有客户信息”的要求。 - 如果遇到一个客户在同一天有多笔购买记录,这个查询会返回该客户的所有当日订单。如果想只保留其中一条(比如金额最大的),可以在子查询里再加一层筛选,或者用窗口函数(比如
ROW_NUMBER())来实现,不过如果严格按你要求的JOIN方式,上面的写法就足够满足基础需求了。
内容的提问来源于stack exchange,提问作者user2206329
相关产品推荐
相关产品推荐

