我有一个查询,当前正在使用相关子查询来返回结果,但我认为可以使用ROW_NUMBER()更有说服力地解决问题.
问题在于值v的概况,通过项目的年数.每个项目都有许多版本,每个版本都有自己的配置文件,当引入版本时,它们会启动,数据当前如下所示:
ItemId ItemVersionId Year Value =========================================== 1 1 01 0.1 1 1 02 0.1 1 1 03 0.2 1 1 04 0.2 1 1 05 0.2 1 1 06 0.3 1 1 07 0.3 1 1 08 0.4 1 2 04 0.3 1 2 05 0.3 1 2 06 0.3 1 2 07 0.4 1 2 08 0.5 1 3 07 0.6 1 3 08 0.7 2 1 01 0.1 2 1 01 0.1 2 1 01 0.2 etc
我想使用适用的最新版本返回项目的完整配置文件.对于第1项的上述示例:
ItemId ItemVersionId Year Value =========================================== 1 1 01 0.1 1 1 02 0.1 1 1 03 0.2 1 2 04 0.3 1 2 05 0.3 1 2 06 0.3 1 3 07 0.6 1 3 08 0.7
我目前正在使用
SELECT ItemId, ItemVersionId, Year, Value FROM table t WHERE ItemId = 1 AND ItemVersionId = (SELECT MAX(ItemVersionId) FROM table WHERE ItemId = t.ItemId AND Year = t.Year)
虽然这返回正确的我怀疑有一种更有效的方法来做到这一点,特别是当表变大时.
我正在使用SQL Server 2005.
提前致谢
我会用CTE做到这一点:
WITH Result AS ( SELECT Row_Number() OVER (PARTITION BY ItemId, Year ORDER BY ItemversionId DESC) AS RowNumber ,ItemId ,ItemversionId ,Year ,Value FROM table ) SELECT ItemId ,ItemversionId ,Year ,Value FROM Result WHERE RowNumber = 1 ORDER BY ItemId, Year