You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 07:15:25