Generated columns using aggregate functions

后端 未结 2 1728
遥遥无期
遥遥无期 2021-01-22 11:47

The starting point

Suppose I have a table devTest that looks like this:

+----+------+  
| id | j    |  
+----+------+  
|  1 |    5 |  
|          


        
2条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2021-01-22 12:44

    In standard SQL you'd do:

    select id, j, (j - avg(j) over ()) / std(j) over () as jdev
    from devtest;
    

    But MySQL doesn't support analytic window functions such as AVG OVER. So in MySQL, you must select the aggregation values separately:

    select d.id, d.j, (d.j - agg.javg) / agg.jstd as jdev
    from devtest d
    cross join (select avg(j) as javg, std(j) as jstd from devtest) agg;
    

    Then create a view as Benjamin Crouzier suggests in his answer:

    CREATE VIEW v_devtest AS
      select d.id, d.j, (d.j - agg.javg) / agg.jstd as jdev
      from devtest d
      cross join (select avg(j) as javg, std(j) as jstd from devtest) agg;
    

    A computed column can only calculate its value from other values in the same record. So what you are trying to do cannot be done with a calculated column.

提交回复
热议问题