我在 MySQL 上运行了以下触发器:
CREATE DEFINER=`root`@`%` TRIGGER `before_insert` BEFORE INSERT ON `table` FOR EACH ROW SET
new.AVG_COLUMN1 = (SELECT avg(COLUMN1) FROM (SELECT COLUMN1 from table ORDER BY DateTimeCol DESC LIMIT 20) as COLUMN1_A),
new.AVG_COLUMN2 = (SELECT avg(COLUMN2) FROM (SELECT COLUMN2 from table ORDER BY DateTimeCol DESC LIMIT 20) as COLUMN2_A),
new.AVG_COLUMN3 = (SELECT avg(COLUMN3) FROM (SELECT COLUMN3 from table ORDER BY DateTimeCol DESC LIMIT 20) as COLUMN3_A)
基本上,我的目标是在插入新行时根据 COLUMNx 中的最后 20 个条目在 AVG_COLUMNx 列中设置一个自动默认值。使用提到的触发器,这在 MySQL 中工作正常。
我正在将我的项目从 MS 迁移到 Sql Server Express,我正尝试在那里做同样的事情。有没有人对我如何做到这一点有任何好的建议?使用触发器、计算列等?
感谢任何输入!
最佳答案
SQL Server 中的逻辑会有所不同,因为它会使用 inserted
而不是 new
。基本上:
update t
set AVG_ROW1 = tt.avg1,
AVG_ROW2 = tt.avg2,
AVG_ROW3 = tt.avg3
from table t join
inserted i
on i.pk = t.pk outer apply
(select avg(Row1) as avg1, avg(Row2) as avg2, avg(Row3) as avg3
from (select top 20 t.*
from table t
order by DateTimeRow desc
) t
) tt;
您需要行中的一些标识符来匹配要inserted
的表。这就是 pk
的含义。
关于mysql - SQL Server 默认值 x 行的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35556367/