sql - 如何避免选择查询中的排序运算符

标签 sql sql-server tsql query-performance sql-execution-plan

在我的 select 语句中,我有一个简单的子查询,它获取 ControlNo 中的最后一个 ExpirationDate

此子查询显着降低了性能。 QuoteID 是表 tblQuotes 上的聚集索引

统计数据是最新的。

SELECT
  ControlNo,
  PolicyNumber,
(     
  SELECT TOP 1 Q.ExpirationDate
  FROM tblQuotes Q 
  WHERE Q.ControlNo = tblQuotes.ControlNo
  ORDER BY Q.QuoteID DESC
 )
SUM(Premium) as Premium
FROM tblQuotes
GROUP BY ...

enter image description here

enter image description here

在这种情况下是否可以找到解决方法?

最佳答案

尝试替换子查询:

(     
  SELECT TOP 1 Q.ExpirationDate
  FROM tblQuotes Q 
  WHERE Q.ControlNo = tblQuotes.ControlNo
  ORDER BY Q.QuoteID DESC
 )

如果您正在寻找最大值,请使用 Windows 函数

MAX(ExpirationDate) OVER(PARTITION BY ControlNo)

如果您要按特定顺序查找第一个值,请使用:

FIRST_VALUE(ExpirationDate) OVER(PARTITION BY ControlNo ORDER BY QuoteID DESC)

关于sql - 如何避免选择查询中的排序运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54836920/

相关文章:

sql - 选择每个 id 的前 x

sql - 如何使用 BigQuery 关联子 ID 和父 ID

sql-server - 查询保留最新的非零值

sql-server - 使用其他表中的数据创建计算字段

sql-server - 选择由另一个表中的另一列命名的列

sql - 将所有序列的序列更改为具有最大 ID 的所有列

sql-server - 参数化 OFFSET 和 FETCH NEXT 的值

php - 获取列年份的总和

sql - 尝试创建大型动态查询时,不断被截断

sql - 从集合 1 ... 49 中生成 6 个无重复的数字