回答

收藏

T SQL-雄辩地替换相关子查询

技术问答 技术问答 230 人阅读 | 0 人回复 | 2023-09-14

我有一个查询,目前使用相关子查询返回结果,但我认为可以使用ROW_NUMBER()更雄辩地解决问题。# a7 n! l4 B: U* B
问题围绕着值v通过项目年数进行分布。每个项目都有多个版本,每个版本都有自己的配置文件,并在引入版本时启动。当前数据如下:
4 O, R' j7 ^: j9 A; _ItemId ItemVersionId年份值==========================================1 1 01 0.11 1 02 0.11 1 03 0.21 1 04 0.21 1 05 0.21 1 06 0.31 1 07 0.31 1 08 0.41 2 04 0.31 2 05 0.31 2 06 0.31 2 07 0.41 2 08 0.51 3 07 0.61 3 08 0.72 1 01 0.12 1 01 0.12 1 01 0.2等等我想使用适用的最新版本来返回商品的完整信息。项目1的上述示例:
7 R2 }4 e" s( ]% X0 aItemId ItemVersionId年份值==========================================1 1 01 0.11 1 02 0.11 1 03 0.21 2 04 0.31 2 05 0.31 2 06 0.31 3 07 0.61 3 08 0.7我目前正在使用它
; N+ N* Y7 b9 G) b* ~SELECT ItemId,ItemVersionId,Year,ValueFROM table tWHERE    ItemId = 1    AND ItemVersionId = (SELECT MAX(ItemVersionId) FROM table WHERE ItemId = t.ItemId AND Year = t.Year)虽然这将返回到正确的值,但我怀疑有一种更有效的方法来执行此操作,特别是当表变大时。
0 t) }2 `, _) _9 ^0 _$ s我正在使用SQL Server 2005。
* V) u; H: U: F+ L- P$ H. w' X提前致谢
! D5 s; ~* f6 b, H                                                               
- D$ {8 }8 S( s! F    解决方案:                                                               
* ]: [; I0 F: B) d: G: G. K8 Z                                                                我会通过CTE这样做:
6 d$ [. ~$ M% b# Z$ ^WITH Result AS(  SELECT Row_Number() OVER (PARTITION BY ItemId,YearORDER BY ItemversionId DESC) AS RowNumber  ItemId  ItemversionId  Year  Value  FROM table)SELECT ItemId  ,ItemversionId  ,Year  ,ValueFROM ResultWHERE RowNumber = 1ORDER BY ItemId,Year
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则