【问题标题】:T-SQL Trigger to subtract previous from current to be inserted in new tableT-SQL触发器从当前减去前一个要插入新表
【发布时间】:2019-03-17 22:51:03
【问题描述】:

我有一个 T-SQL 表 SystemReading,它保存水系统的仪表读数。在给定站点获取下一个读数后,我需要从当前读数中减去前一个读数,以获得要插入 SystemUsage 表的两个读数之间的使用情况。第一个表有 ReadingID(身份)、SysMeterID(仪表站点)、Reading、ReadingDate。第二个表,我的usage表,有UsageID(身份)、SysMeterID(仪表站点)、Usage、ReadingDate。我需要确保触发器中仅使用与当前相同的 SysMeterID 的先前读数。我以前使用 CTE 来查找此用法,但现在我需要它自动计算并插入到新的用法表中。任何帮助表示赞赏。

这是我的旧 CTE 供参考:

 ;WITH tblDifference as (
    SELECT Row_Number() OVER (ORDER BY ReadingID) as RowNumber, Reading, SysMeterID, ReadingDate
    FROM Supplydb.app.SystemReading 
    WHERE SysMeterID = 18

)
SELECT Cur.Reading, Cur.Reading - Prv.Reading as TotalPumped, cur.ReadingDate as Date
FROM tblDifference as Cur
LEFT OUTER JOIN tblDifference Prv
ON Cur.RowNumber = Prv.RowNumber+1
where cur.rownumber = 3
ORDER BY cur.ReadingDate DESC 

【问题讨论】:

    标签: sql tsql sql-server-2008 triggers


    【解决方案1】:

    希望你能用这个插入触发器来计算用量

        CREATE TRIGGER Tgr_AddUsage ON SystemReading  
        AFTER INSERT
        AS 
        BEGIN
            SET NOCOUNT ON;
            DECLARE @SysMeterID  int
    
            SELECT @SysMeterID = SysMeterID FROM Inserted
    
            INSERT INTO SystemUsage (SysMeterID, Usage, ReadingDate)
                SELECT t1.SysMeterID, t1.Reading - t2.Reading as Usage, t1.ReadingDate
                  FROM Inserted t1 LEFT OUTER JOIN 
                        (SELECT TOP 2 * FROM SystemReading WHERE SysMeterID = @SysMeterID ORDER BY ReadingID DESC) t2 ON t1.ReadingID <> t2.ReadingID 
        END
        GO
    

    【讨论】:

    • SELECT @SysMeterID = SysMeterID FROM Inserted 假定每个 insert 语句只有一行。情况可能并非如此。
    • 我认为,他需要在添加 SystemReading 后立即计算使用量。
    • insert 语句可能会添加不止一行。 OP 的应用程序可能一次插入一行,也可能不插入一行,例如抄表员可能会带着他们的 Scan-U-Matic 从现场返回并立即加载当天的所有抄表读数。如果您的代码基于处理单行insert,那么它应该包含检查inserted 中的行数并使用RaIsErrorThrow 来通知客户端如果计数不是1 .
    • 非常感谢您的帮助。每个插入语句只会添加一行。
    【解决方案2】:

    我会跳过 CTE 并使用 LAG(按 SysMeterID 分区)并根据需要对您的 Current-Previous 计算进行排序。

    【讨论】:

    • 但是 LAG 的问题在于它是一个查询。我需要将数据推送到另一个表中。 LAG(我相信)意味着我每次都必须像 CTE 一样手动启动查询
    • LAG 本身是一个函数,而不是一个查询。您可以将其用作 INSERT INTO Usage 语句的查询的一部分。或者一个 UPDATE 语句,我想,这取决于你的 Usage 表是什么样的。如果您希望根据您的 SystemReading 数据实际更改/添加到您的使用表,您将需要其中一个。
    • 问题标记为sql-server-2008LAG 于 2012 年推出。
    猜你喜欢
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多