【问题标题】:Sql Server default value average of x rowsSql Server 默认值 x 行平均值
【发布时间】:2016-02-22 14:37:35
【问题描述】:

我在 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,我正在尝试在那里做同样的事情。有没有人对我如何做到这一点有任何好的指示?使用触发器、计算列等?

感谢您的任何意见!

【问题讨论】:

  • 就像我说的,我正在使用的触发器是在 MySQL 上,但我正在寻找一个 SQL Server 等效项(我计划将我的项目从 MySQL 迁移到 SQL Server Express)。
  • 是的,我仔细阅读后注意到了。我在帖子中添加了MySQLdatabase-migration 标签以澄清

标签: mysql sql sql-server average database-migration


【解决方案1】:

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 的含义。

【讨论】:

  • 是的,我有一个自动递增的 ID 列定义为主键。感谢您的意见,我将尝试使用它,并在它工作时尝试在触发器中实现它。
猜你喜欢
  • 2014-10-24
  • 1970-01-01
  • 1970-01-01
  • 2015-11-22
  • 1970-01-01
  • 1970-01-01
  • 2014-08-18
  • 2023-03-24
  • 1970-01-01
相关资源
最近更新 更多