如何在SQL Server查询中获取商品的最新价格
在SQL Server中实现Access里LAST()函数的分组取最新价格功能
SQL Server没有Access中那种直接可用的LAST()聚合函数,但可以通过以下几种实用方法实现「按商品分组,获取最新价格」的需求:
方法1:使用窗口函数ROW_NUMBER()(推荐)
这是最灵活、兼容性最好的方案,适合绝大多数场景。核心思路是给每个商品的记录按「最新顺序」编号,再筛选出每组内编号为1的记录。
WITH RankedItems AS ( SELECT code, name, prices, -- 按商品分组,按记录的"最新"顺序编号 ROW_NUMBER() OVER ( PARTITION BY code, name ORDER BY (SELECT NULL) DESC -- 模拟Access LAST()的物理存储顺序 -- 实际业务中建议替换为明确的排序字段,比如价格更新时间: -- ORDER BY price_update_time DESC ) AS rn FROM Items ) SELECT code, name, prices FROM RankedItems WHERE rn = 1;
注意:如果你的表有price_update_time(价格更新时间)或create_time(记录创建时间)这类字段,一定要用它来排序,这样才能保证拿到的是业务逻辑上的最新价格,而非物理存储的随机最后一条。
方法2:使用TOP 1 WITH TIES(简洁版)
适合简单场景,语法更紧凑:
SELECT TOP 1 WITH TIES code, name, prices FROM Items ORDER BY ROW_NUMBER() OVER ( PARTITION BY code, name ORDER BY (SELECT NULL) DESC -- 同样建议替换为业务排序字段,比如ORDER BY price_update_time DESC );
TOP 1 WITH TIES会返回所有排序后排名第一的记录,配合窗口函数实现分组取最新的效果。
方法3:关联子查询(适配旧版SQL Server)
如果使用的是SQL Server 2008及以前不支持窗口函数的版本,可以用子查询先定位每组的最新记录标识,再关联原表获取数据:
SELECT i.code, i.name, i.prices FROM Items i INNER JOIN ( -- 假设表有自增主键id,通过MAX(id)定位最新插入的记录 SELECT code, name, MAX(id) AS latest_id FROM Items GROUP BY code, name ) latest ON i.code = latest.code AND i.name = latest.name AND i.id = latest.latest_id;
内容的提问来源于stack exchange,提问作者Aso Salih
相关产品推荐
相关产品推荐

