我希望更新sql中的计算总和
基本上我有一张桌子:
ImportID SeiralNumber Day Hour value Difference Complete
1 123 1 1 6 NULL 0
2 123 1 2 8 NULL 0
3 123 1 5 21 NULL 0
4 123 1 6 28 NULL 0
5 222 2 2 12 NULL 0
6 222 2 5 18 NULL 0
7 222 2 4 16 NULL 0
8 222 1 12 8 NULL 0
对于每个序列号,将有一天1-365和一小时到1-12,我想要做的就是计算从记录之前提交的差异
因此,使用ImportID 6,我需要获取同一天和前一小时的记录(importID 7)然后我需要使用值字段18 -17 = 1来更新差异。
N.B。序列中可能存在间隙,如果没有先前的记录,则差异应保持为NULL
。计算完毕后,只有当差异为not null
并且表中已不存在时,才需要将它们插入到新表中,在成功插入时,它们会被标记为完整。之前的记录也可以是前一天(第1天12小时)是之前的记录(第2天,第1小时)
目前我正在使用循环来选择空值,获取上一条记录,更新记录,如果其确定插入到其他表中,则更新已完成字段。
我的问题是,这是在处理一百万条记录,并且需要很长时间才能将适用的记录(已完成= 0)选入临时表并循环遍历每个记录。
有没有更快捷的方法来批量处理这些作为更新声明?或单独陈述?
结果应为
ImportID SeiralNumber Day Hour value Difference Complete
1 123 1 1 6 NULL 0
2 123 1 2 8 2 1
3 123 1 5 21 NULL 0
4 123 1 6 28 7 1
5 222 2 1 12 4 1
6 222 2 5 18 2 1
7 222 2 4 16 NULL 0
8 222 1 12 8 NULL 0
提前致谢
答案 0 :(得分:3)
我认为这基本上不是吗?
DECLARE @TABLE TABLE
(
ImportId INT,
SerialNumber INT,
Day INT,
Hour INT,
Value INT,
Difference INT,
Complete INT
)
INSERT INTO @TABLE VALUES
(1,123,1,1,6,NULL,0),
(2,123,1,2,8,NULL,0),
(3,123,1,5,21,NULL,0),
(4,123,1,6,28,NULL,0),
(5,222,2,1,12,NULL,0),
(6,222,2,5,18,NULL,0),
(7,222,2,4,16,NULL,0),
(8,222,1,12,8,NULL,0)
SELECT * FROM @Table
UPDATE T
SET T.Difference = T.Value - TT.Value,
Complete = 1
FROM
(
SELECT *
,ROW_NUMBER() OVER (PARTITION BY SerialNumber ORDER BY Day ASC, Hour ASC) AS RowCounter
FROM @TABLE
WHERE Complete = 0 --Ignore completed ones
)AS T
INNER JOIN
(
SELECT *
,ROW_NUMBER() OVER (PARTITION BY SerialNumber ORDER BY Day ASC, Hour ASC) AS RowCounter
FROM @TABLE
)AS TT
ON T.SerialNumber = TT.SerialNumber
WHERE
(
T.RowCounter = TT.RowCounter + 1
AND
T.Day = TT.Day
AND
T.Hour = TT.Hour + 1
)
OR
(
T.Day = TT.Day + 1
AND
T.Hour = 1
AND
TT.Hour = 12
)
SELECT * FROM @TABLE