我的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相同,我想得到当前记录和先前记录的评级差异。
答案 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