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

如何从SQL Server的PriceHistory表获取ItemCode和Location的最新记录?

获取SQL Server中每个ItemCode和Location组合的最新记录

我有一个SQL Server(MSSQL)数据库中的PriceHistory表,表内数据如下:

DocDateDocNoItemCodeLocationQtyUnitPriceAccNo
01/05/23I-00012CodeAHQ82.50300/A01
02/05/23P-62510CodeBBR43.80300/A15
08/05/23I-05478CodeABR62.50400/B11
10/05/23I-15478CodeCBR151.80300/F04
15/05/23S-65741CodeAHQ22.50300/G12
20/05/23P-14785CodeCHQ11.90400/B03
01/06/23I-25413CodeABR202.40300/A10
02/06/23I-23061CodeBHQ33.80301/A05

现需获取每个ItemCode和Location组合对应的最新DocDate记录,期望结果如下:

DocDateDocNoItemCodeLocationQtyUnitPriceAccNo
01/06/23I-25413CodeABR202.40300/A10
02/05/23P-62510CodeBBR43.80300/A15
10/05/23I-15478CodeCBR151.80300/F04
15/05/23S-65741CodeAHQ22.50300/G12
02/06/23I-23061CodeBHQ33.80301/A05
20/05/23P-14785CodeCHQ11.90400/B03

方法一:使用窗口函数ROW_NUMBER()

这是SQL Server中处理此类分组取最新记录场景最简洁高效的方式,通过ROW_NUMBER()按指定分组排序后筛选目标记录:

WITH RankedRecords AS (
    SELECT 
        *,
        ROW_NUMBER() OVER (
            PARTITION BY ItemCode, Location 
            ORDER BY DocDate DESC
        ) AS RowNum
    FROM PriceHistory
)
SELECT 
    DocDate, DocNo, ItemCode, Location, Qty, UnitPrice, AccNo
FROM RankedRecords
WHERE RowNum = 1;

说明:

  • PARTITION BY ItemCode, Location:将数据按商品编码和仓库分组
  • ORDER BY DocDate DESC:每组内按日期倒序排列,最新记录排在首位
  • RowNum = 1:筛选出每组的第一条(最新)记录

方法二:使用子查询关联

若不熟悉窗口函数,可通过子查询先获取每个分组的最大日期,再关联原表获取完整记录:

SELECT 
    ph.DocDate, ph.DocNo, ph.ItemCode, ph.Location, ph.Qty, ph.UnitPrice, ph.AccNo
FROM PriceHistory ph
INNER JOIN (
    SELECT 
        ItemCode, Location, MAX(DocDate) AS MaxDocDate
    FROM PriceHistory
    GROUP BY ItemCode, Location
) latest ON ph.ItemCode = latest.ItemCode 
         AND ph.Location = latest.Location 
         AND ph.DocDate = latest.MaxDocDate;

说明:

  • 子查询先计算每个ItemCode+Location组合的最新日期
  • 通过关联条件匹配原表中对应日期的完整记录

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 03:54:57