使用函数sql更新所有记录

时间:2012-12-07 11:08:56

标签: c# sql sql-server-2008-r2

我希望更新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

提前致谢

1 个答案:

答案 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