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

SQL查询:按Item Code获取最新日期交易记录并关联Products表

解决Products表关联最新交易记录的SQL方案

要实现“获取所有产品+对应最新交易记录”的需求,单纯用LEFT JOIN无法自动筛选最新行,得先对Transactions表做预处理,下面提供两种通用的解决思路:

方法一:先取每个产品的最新交易日期,再关联拿数据

这种方法兼容大多数数据库(包括低版本MySQL),逻辑是先通过分组找到每个Item Code的最新交易日期,再用这个日期去关联Transactions表拿到对应的Qty:

SELECT 
    p.`Item Code`,
    p.`Product Name`,
    t.`Date`,
    t.`Qty`
FROM Products p
LEFT JOIN (
    -- 分组获取每个产品的最新交易日期
    SELECT `Item Code`, MAX(`Date`) AS LatestDate
    FROM Transactions
    GROUP BY `Item Code`
) latest_t ON p.`Item Code` = latest_t.`Item Code`
-- 关联原交易表,匹配Item Code和最新日期
LEFT JOIN Transactions t 
    ON latest_t.`Item Code` = t.`Item Code` 
    AND latest_t.LatestDate = t.`Date`;

注意:如果同一个产品在同一天有多条交易记录,这个查询会返回多条结果,若要合并这些记录,可以在最后一步对Qty做聚合(比如SUM(t.Qty)),或者根据实际需求调整。

方法二:用窗口函数标记最新行(适用于支持窗口函数的数据库)

如果你的数据库支持窗口函数(比如MySQL 8.0+、PostgreSQL、SQL Server等),可以用ROW_NUMBER()直接标记每个产品的最新交易行,逻辑更简洁:

SELECT 
    p.`Item Code`,
    p.`Product Name`,
    t.`Date`,
    t.`Qty`
FROM Products p
LEFT JOIN (
    SELECT 
        `Item Code`,
        `Date`,
        `Qty`,
        -- 按产品分组,交易日期倒序排序,给最新行标记为1
        ROW_NUMBER() OVER (PARTITION BY `Item Code` ORDER BY `Date` DESC) AS rn
    FROM Transactions
) t ON p.`Item Code` = t.`Item Code` AND t.rn = 1;

如果同一个产品在同一天有多条交易,ROW_NUMBER()只会取其中一条(排序后的第一条);如果想保留所有同一天的最新记录,可以把ROW_NUMBER()换成RANK()或者DENSE_RANK()。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 15:54:55