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

如何将Left Join限制为按时间顺序匹配的第一条记录?

实现Left Join仅匹配每个客户的第一笔销售记录

你的当前查询只是对销售表做了排序,但没有筛选出每个客户的第一条记录,所以会关联所有匹配的销售数据。要实现仅关联每个客户的第一笔(最早日期)销售,有两种常用方案:

方案一:使用窗口函数(推荐,适用于支持窗口函数的数据库:MySQL 8.0+、PostgreSQL、SQL Server等)

通过ROW_NUMBER()窗口函数给每个客户的销售记录按时间排序,标记行号后只保留行号为1的记录,再和客户表左连接:

SELECT c.*, s.sales_item_id, s.sales_date
FROM customer_table c
LEFT JOIN (
    SELECT 
        customer_id,
        sales_item_id,
        sales_date,
        -- 按客户分组,每组内按销售日期升序标记行号
        ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY sales_date ASC) AS rn
    FROM sales_table
) s ON c.customer_id = s.customer_id AND s.rn = 1;

如果同一个客户在最早销售日有多笔记录,还可以在ORDER BY后加额外字段(比如sales_item_id ASC)来指定取哪一条。

方案二:使用子查询筛选最早日期(适用于不支持窗口函数的旧版本数据库)

先通过子查询找到每个客户的最早销售日期,再关联销售表获取对应记录:

SELECT c.*, s.sales_item_id, s.sales_date
FROM customer_table c
LEFT JOIN sales_table s 
    ON c.customer_id = s.customer_id
    AND s.sales_date = (
        SELECT MIN(sales_date) 
        FROM sales_table 
        WHERE customer_id = c.customer_id
    );

注意:如果同一客户在最早日期有多笔销售,这个查询会返回所有当天的记录。如果要确保只取一条,可以在子查询中同时筛选最小的sales_item_id,修改关联条件为:

AND (s.sales_date, s.sales_item_id) = (
    SELECT MIN(sales_date), MIN(sales_item_id) 
    FROM sales_table 
    WHERE customer_id = c.customer_id
);

内容的提问来源于stack exchange,提问作者blo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 01:50:02