You need to enable JavaScript to run this app. SQL Server获取MAX(Date)对应行值:查询库存项最近供应商的分组问题
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.07 00:15:04