通过使用Partition by function为每个插入的值添加一个运行的总列

时间:2018-05-30 18:29:59

标签: sql-server

如果您对此问题有更好的标题,请告诉我。感谢您提前了解。

表I在插入后需要更新总列

FK_Key  Score    Total
----------------------
121       1      NULL
121       5      NULL
121       7      NULL

我想要做的是通过查看分数值来更新Total列:

FK_Key   Score    Total
-----------------------
121        1        1
121        5        6
121        7       13

我们假设在表中为同一个外键插入了一个新行:

121        6       19

每次发生新插入时,都应更新Total列,汇总由FK分组的Score列中的值 - 此处Score为19即(1 + 5 + 7 + 6)

基本上我正在寻找一个更新语句,该语句通过Score列查看并更新每个FK的值。我不希望在所有FK的

中更新相同的值

以下是要使用

的查询
IF OBJECT_ID('tempdb..#Table1') IS NOT NULL 
   DROP TABLE #Table1
GO

CREATE TABLE #Table1
(
    FK_Key INT,
    Score INT NULL,
    Total INT NULL, 
)

INSERT INTO #Table1
VALUES (121, 1, NULL), (121, 5, NULL), (121, 7, NULL), (121, 6, NULL)

SELECT * FROM #Table1

预期结果

enter image description here

1 个答案:

答案 0 :(得分:0)

正如我在评论中所述,我的建议是更改表结构以包含“Timestamp”类型列,以便您知道何时插入数据,否则,您无法保证具有完全相同的记录集每次运行查询时返回,然后创建视图以获取所需的数据。

您的解决方案如下:

CREATE TABLE #Table1
(
     FK_Key     INT
    ,Score      INT       NULL
    ,InsertTime DATETIME2 DEFAULT GETDATE()
)

INSERT INTO
    #Table1 (FK_Key, Score)
VALUES
    (121, 1), (121, 5), (121, 7), (121, 6)

SELECT
     FK_Key
    ,Score
    -- ,InsertTime
    ,SUM(Score) OVER (PARTITION BY FK_Key ORDER BY InsertTime ROWS UNBOUNDED PRECEDING) AS Total
FROM
    #Table1

显然,最后一个查询可以存储为视图。

这样可以获得一致的结果,并且还可以处理删除行之后的情况,这会导致当前运行的总逻辑陷入混乱。

希望有意义/有帮助。