如何用GROUP BY多字段筛选美国客户的最新购买记录
获取美国客户最新购买记录的正确SQL写法
你的原查询问题出在GROUP BY同时包含了user_id和purchased_item——这会把同一用户的不同购买商品拆分成独立分组,每个分组都会计算对应商品的最大购买日期,因此会返回多条记录,无法得到每个用户唯一的最新购买记录。
下面提供两种通用的解决方案:
方案一:使用窗口函数(推荐)
适用于支持窗口函数的数据库(MySQL 8.0+、PostgreSQL、SQL Server、Oracle等),逻辑清晰且性能优异:
SELECT user_id, purchased_item FROM ( SELECT c.user_id, p.purchased_item, -- 按用户分区,每个用户内按购买日期倒序编号 ROW_NUMBER() OVER (PARTITION BY c.user_id ORDER BY p.date_of_purchase DESC) AS row_rank FROM customers c INNER JOIN purchases p ON c.user_id = p.user_id WHERE c.country = 'USA' ) AS ranked_purchases -- 取每个用户的第一条(最新)记录 WHERE row_rank = 1;
如果存在同一用户在同一日期有多条购买记录的情况,且需要保留所有这些记录,可以把ROW_NUMBER()替换为RANK()。
方案二:子查询关联最大日期
兼容大多数旧版数据库,通过子查询先获取每个用户的最新购买日期,再关联回原表筛选对应记录:
SELECT c.user_id, p.purchased_item FROM customers c INNER JOIN purchases p ON c.user_id = p.user_id WHERE c.country = 'USA' AND (p.user_id, p.date_of_purchase) IN ( -- 先算出每个用户的最新购买日期 SELECT user_id, MAX(date_of_purchase) FROM purchases GROUP BY user_id );
内容的提问来源于stack exchange,提问作者Ben Kitai
相关产品推荐
相关产品推荐

