当前位置: 首页 > 面试题库 >

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

柴昆杰
2023-03-14
问题内容

我有一个查询,当前正在使用相关子查询来返回结果,但是我认为可以使用ROW_NUMBER()更雄辩地解决问题。

问题围绕着值v的分布,通过项的年数。每个项目都有多个版本,每个版本都有自己的配置文件,在引入版本时即会启动,当前数据如下所示:

ItemId ItemVersionId年份值
==========================================
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
等等

我想使用适用的最新版本返回商品的完整资料。对于项目1的上述示例:

ItemId ItemVersionId年份值
==========================================
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


 类似资料:
  • 我正在使用Laravel和它提供的雄辩的ORM,但我正在努力选择我需要的数据。我有两种型号 我该怎么做?

  • 我有一个表事务与复合主键id,Nom,日期和一个表Cour与Nom作为主键和一个事务有关一个Cour。 我怎样才能得到一个有口才关系的特定交易的课程?

  • 我有两个模型。模型有一个(关系)。 关于模型,我有以下关系:

  • 我正在构建一个客户端应用程序,它需要在服务器API响应中包含相关模型的ID。 在我的例子中,我有两个模型,一个Post和一个Tag模型。它们之间的关系是多对多的,所以需要一个数据透视表。 我在路径上设置了一个resourcefull控制器,如下所示: 这将返回一个非常像这样的响应: 我要寻找的是一种在响应中包含相关标签模型ID的简单方法,如下所示:

  • 我有两张桌子。 产品品牌 我试图用最多的产品返回前十大品牌型号。 我试过了。 但是它不返回孔模型,只返回 品牌 计数 我也试过 但是我得到了错误: SQLSTATE[42S22]:未找到列:“where子句”中的1054未知列“brands.id”(SQL:选择count(*)作为从whereid=

  • 我有以下三种型号: 类别字段: 分类选项: 当我运行这个查询时,我得到了这个错误: SQLSTATE[42S22]:列未找到: 1054未知列'field ID'在'where子句'(SQL:选择*从其中=3)任何帮助请知道是什么问题!!?