如何从SQL Server的PriceHistory表获取ItemCode和Location的最新记录?
获取SQL Server中每个ItemCode和Location组合的最新记录
我有一个SQL Server(MSSQL)数据库中的PriceHistory表,表内数据如下:
| DocDate | DocNo | ItemCode | Location | Qty | UnitPrice | AccNo |
|---|---|---|---|---|---|---|
| 01/05/23 | I-00012 | CodeA | HQ | 8 | 2.50 | 300/A01 |
| 02/05/23 | P-62510 | CodeB | BR | 4 | 3.80 | 300/A15 |
| 08/05/23 | I-05478 | CodeA | BR | 6 | 2.50 | 400/B11 |
| 10/05/23 | I-15478 | CodeC | BR | 15 | 1.80 | 300/F04 |
| 15/05/23 | S-65741 | CodeA | HQ | 2 | 2.50 | 300/G12 |
| 20/05/23 | P-14785 | CodeC | HQ | 1 | 1.90 | 400/B03 |
| 01/06/23 | I-25413 | CodeA | BR | 20 | 2.40 | 300/A10 |
| 02/06/23 | I-23061 | CodeB | HQ | 3 | 3.80 | 301/A05 |
现需获取每个ItemCode和Location组合对应的最新DocDate记录,期望结果如下:
| DocDate | DocNo | ItemCode | Location | Qty | UnitPrice | AccNo |
|---|---|---|---|---|---|---|
| 01/06/23 | I-25413 | CodeA | BR | 20 | 2.40 | 300/A10 |
| 02/05/23 | P-62510 | CodeB | BR | 4 | 3.80 | 300/A15 |
| 10/05/23 | I-15478 | CodeC | BR | 15 | 1.80 | 300/F04 |
| 15/05/23 | S-65741 | CodeA | HQ | 2 | 2.50 | 300/G12 |
| 02/06/23 | I-23061 | CodeB | HQ | 3 | 3.80 | 301/A05 |
| 20/05/23 | P-14785 | CodeC | HQ | 1 | 1.90 | 400/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
相关产品推荐
相关产品推荐

