SQL Server获取MAX(Date)对应行值:查询库存项最近供应商的分组问题
现有SQL返回异常的核心原因
- 分组逻辑和需求不匹配:当前SQL以
ST.AccountLink、V.Account作为联合分组维度,计算的是每一个“库存项-合作供应商”组合各自的最大交易日期,而非单个库存项全局维度下的最大交易日期。只要同一库存项存在多个历史合作供应商,就会返回多组不同日期的结果,完全不符合“每个库存项仅对应最近一次交易的供应商”的预期。
可行的修改实现
根据数据库对窗口函数的支持情况,可选择以下两种方案:
方案1:窗口函数排序(适配主流数据库,逻辑直观)
通过窗口函数按库存项维度对交易记录按日期倒序排序,仅取排序为第1的记录,直接拿到对应最新交易下的供应商:
WITH ranked_txn AS ( SELECT ST.AccountLink, V.Account AS Supplier, ST.TxDate, ROW_NUMBER() OVER ( PARTITION BY ST.AccountLink ORDER BY ST.TxDate DESC ) AS row_rank FROM _bvSTTransactionsFull AS ST JOIN Vendor V ON ST.DrCrAccount = V.DCLink WHERE Module = 'AP' AND Id = 'OGrv' ) SELECT AccountLink, TxDate AS Date, Supplier FROM ranked_txn WHERE row_rank = 1 ORDER BY AccountLink
方案2:子查询关联(适配不支持窗口函数的老旧数据库)
先独立计算每个库存项的全局最大交易日期,再将原交易表与这个结果做等值关联,匹配出对应日期下的供应商记录:
SELECT ST.AccountLink, max_txn.Date, V.Account AS Supplier FROM _bvSTTransactionsFull AS ST JOIN Vendor V ON ST.DrCrAccount = V.DCLink INNER JOIN ( -- 先按库存项分组计算全局最大交易日期 SELECT AccountLink, MAX(TxDate) AS Date FROM _bvSTTransactionsFull WHERE Module = 'AP' AND Id = 'OGrv' GROUP BY AccountLink ) AS max_txn ON ST.AccountLink = max_txn.AccountLink AND ST.TxDate = max_txn.Date WHERE ST.Module = 'AP' AND ST.Id = 'OGrv' ORDER BY ST.AccountLink
注意:如果同一库存项在同一最大交易日期下存在多个供应商的匹配记录,两种方案都会返回全部匹配行,可根据实际业务规则补充排序条件(如按交易单号、交易金额倒序),确保每个库存项仅返回一条预期结果。
内容的提问来源于stack exchange,提问作者Gray Meiring
相关产品推荐
相关产品推荐

