如何减少查询执行时间

时间:2016-05-27 01:10:44

标签: sql sql-server sql-server-2014

我的MasterTable中有数百万条带有不同CustNo的记录,我想减少查询执行时间。是否有更有效的查询?

SELECT a.CustNo AS CustNo ,
       CAST(a.CustRating as decimal(10,9) AS CustRating,
       a.RatingDate AS RatingDate,
       CAST((a.CustRating-b.CustRating) as decimal(10,9)) AS [Rating Difference]
FROM MasterTable a
JOIN MasterTable b
ON b.CustNo = a.CustNo
ORDER BY CustNo 

这是原始表[MasterTable]

CustNo  CustRating  RatingDate
101AAA  0.000500000 "2016-01-08 00:00:00.000"
101AAA  0.000000750 "2016-01-12 00:00:00.000"
101AAA  0.000000550 "2016-01-22 00:00:00.000"
101AAA  0.000000000 "2016-01-27 00:00:00.000"

此处的目标是根据客户编号计算每一行中客户评级的差异。有没有更有效的方法来做到这一点?例如,如果custNo相同,我想得到当前记录和先前记录的评级差异。

2 个答案:

答案 0 :(得分:2)

您可以改为使用LAG功能:

  

访问同一结果集中前一行的数据,而不使用SQL Server 2016中的自联接.LAG提供对当前行之前的给定物理偏移量的行的访问。在SELECT语句中使用此分析函数将当前行中的值与前一行中的值进行比较

SELECT
    CustNo AS CustNo,
    CAST(CustRating AS DECIMAL(10, 9)) AS CustRating,
    RatingDate AS RatingDate,
    CAST((CustRating - LAG(CustRating, 1, 0) OVER(PARTITION BY CustNo ORDER BY RatingDate)) AS DECIMAL(10, 9)) AS [Rating Difference]
FROM MasterTable
ORDER BY CustNo, RatingDate

答案 1 :(得分:1)

不被视为答案。

对Felix只是一个小小的调整。在他的滞后期间,他将默认值设置为0.因此在第一次观察中,评级差异为+.0005。恕我直言,新的评级不是一个变化(它是速率 - 容量 - 差异报告中的一个因素)

我对Felix的查询所做的唯一更改是>>> LAG(CustRating,1,CustRating)<<<<

Declare @MasterTable table (CustNo varchar(50),CustRating decimal(11,9),RatingDate Date)
Insert Into @MasterTable (CustNo,CustRating,RatingDate) values 
('101AAA',  0.000500000,'2016-01-08'),
('101AAA',  0.000000750,'2016-01-12'),
('101AAA',  0.000000550,'2016-01-22'),
('101AAA',  0.000000000,'2016-01-27')

    SELECT
        CustNo AS CustNo,
        CAST(CustRating AS DECIMAL(10, 9)) AS CustRating,
        RatingDate AS RatingDate,
        CAST((CustRating - LAG(CustRating, 1, CustRating) OVER(PARTITION BY CustNo ORDER BY RatingDate)) AS DECIMAL(10, 9)) AS [Rating Difference]
    FROM @MasterTable
    ORDER BY CustNo, RatingDate

结果

CustNo  CustRating  RatingDate  Rating Difference
101AAA  0.000500000 2016-01-08  0.000000000
101AAA  0.000000750 2016-01-12  -0.000499250
101AAA  0.000000550 2016-01-22  -0.000000200
101AAA  0.000000000 2016-01-27  -0.000000550
相关问题