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
相关产品推荐
相关产品推荐

