Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何避免select查询中的排序运算符_Sql_Sql Server_Tsql_Query Performance_Sql Execution Plan - Fatal编程技术网

Sql 如何避免select查询中的排序运算符

Sql 如何避免select查询中的排序运算符,sql,sql-server,tsql,query-performance,sql-execution-plan,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.Qu

在我的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 ...


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

尝试替换子查询:

(     
  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)

如果最新记录包含最新的ExpirationDate,则只需使用与以下类似的MAX运算符:

  SELECT
    ControlNo,
    PolicyNumber,
    MAX(ExpirationDate) ExpirationDate,
    SUM(Premium) as Premium
  FROM tblQuotes
  GROUP BY ControlNo, PolicyNumber;
但是,如果ExpirationDate并不总是最新的,并且您只想获得最新记录的值,那么我建议类似于以下内容。在获取ExpirationDate之前,首先获取QouteID值(假设这是PK),以便在查找ExpirationDate值时在排序时最小化

SELECT q.*, qx.ExpirationDate 
FROM 
  (
    SELECT ControlNo, PolicyNumber, SUM(Premium) as Premium
    FROM tblQuotes t
    GROUP BY ControlNo, PolicyNumber
  ) q
  OUTER APPLY
  (
    SELECT ExpirationDate
    FROM tblQuotes q2
    WHERE q2.QuoteID=(SELECT MAX(QouteID) MaxQouteID FROM tblQuotes q1 WHERE q1.ContolNo=q.ControlNo)
  ) qx;

ControlNo,QuoteID include(ExpirationDate)
上的索引应该可以去掉排序和假脱机!非常感谢你!