T-SQL - 创建一个触发器,用过去 90 天内类似记录的平均值来更新更新记录的平均时间?

T-SQL - Create a trigger to update the updated record's average time with the average of similar records over the past 90 days?

我正在尝试创建一个触发器,调用它时,将使用过去 90 天的平均值更新最近更新记录的 RollingAvgTime 列。

系统信息: SQL 服务器

Table :

相关栏目:

本质上,我试图更新最后三列(以前为空),以便在存储过程更新记录时获得相关信息。

我非常乐意提供更多详细信息!提前致谢!

编辑:这是我现在使用的代码,它可以编译,但不正确。

CREATE TRIGGER TR_BatchLog_Update
ON dbo.BatchLog
AFTER UPDATE AS
BEGIN
SET NOCOUNT ON;

DECLARE @BatchLogNId INT
SELECT
  @BatchLogNId = INSERTED.BatchLogNId
FROM
  INSERTED
INNER JOIN
  DELETED
    ON INSERTED.BatchLogNId = DELETED.BatchLogNId
    -- It's an update if the record is in BOTH inserted AND deleted

UPDATE BatchLog
SET RollingAvgTime = (
 SELECT AVG(ElapsedTime)
 FROM BatchLog
 WHERE BatchLogNId = @BatchLogNId
 AND EndTime <= DATEADD(MONTH, -3, GETDATE())
)
END
GO

决赛:

工作代码!

Use LogilityPHAdmin
GO
DROP TRIGGER TR_BatchLog_Update
GO
CREATE TRIGGER TR_BatchLog_Update
ON dbo.BatchLog
AFTER UPDATE AS
BEGIN
SET NOCOUNT ON;

UPDATE b
SET RollingAvgTime = (
 SELECT AVG(ElapsedTime)
 FROM BatchLog b2
 WHERE b2.EndTime > DATEADD(MONTH, -3, GETDATE())
 AND b2.DivCd = b.DivCd
 AND b2.ProgramName = b.ProgramName
 AND b2.Successful = 1
)
FROM BatchLog b
INNER JOIN inserted I
  ON b.BatchLogNId=i.BatchLogNId


UPDATE b
SET RollingStdDev = (
 SELECT STDEV(ElapsedTime)
 FROM BatchLog b2
 WHERE b2.EndTime > DATEADD(MONTH, -3, GETDATE())
 AND b2.DivCd = b.DivCd
 AND b2.ProgramName = b.ProgramName
 AND b2.Successful = 1
)
FROM BatchLog b
INNER JOIN inserted I
  ON b.BatchLogNId=i.BatchLogNId


UPDATE b
 SET DifferenceFromAvg = (b.RollingAvgTime - b.ElapsedTime)
 FROM BatchLog b
 INNER JOIN inserted I
 ON b.BatchLogNId=i.BatchLogNId

END
GO

试试这个。请注意 UPDATE 如何连接到插入的 table 以便它将处理多个插入,而不是使用变量。

CREATE TRIGGER TR_BatchLog_Update
ON dbo.BatchLog
AFTER UPDATE AS
BEGIN
SET NOCOUNT ON;

UPDATE b
SET RollingAvgTime = (
 SELECT AVG(DATEDIFF(minute,0,ElapsedTime))
 FROM BatchLog b2
 WHERE b2.BatchLogNId = b.BatchLogNId
 AND b2.EndTime <= DATEADD(MONTH, -3, GETDATE())
)
FROM BatchLog b
INNER JOIN inserted I
  ON b.BatchLogNId=i.BatchLogNId

END
GO