【问题标题】:Can (aggregate) functions be used to define a column?(聚合)函数可以用于定义列吗?
【发布时间】:2019-04-15 21:24:48
【问题描述】:

假设有这样一张表:

a | b | total
--|---|------
1 | 2 |  3
4 | 7 | 11
…

CREATE TEMPORARY TABLE summedup (
    a double precision DEFAULT 0
  , b double precision DEFAULT 0
  --, total double precision
);
INSERT INTO summedup (a, b) VALUES (1, 2);
INSERT INTO summedup (a, b) VALUES (4, 7);

SELECT a, b, a + b as total FROM summedup;

很容易总结 SELECT 的前两列。

但是 Postgres (9.6) 是否也支持将total 定义为其他两列之和的功能?如果是这样:

  • 语法是什么?
  • 这种类型的操作称为什么(聚合通常对多行而不是列的单元格求和。)

【问题讨论】:

    标签: postgresql calculated-columns postgresql-9.6


    【解决方案1】:

    您要查找的内容通常称为“计算列”。

    Postgres 9.6 不支持这一点(Postgres 12 - 将于 2019 年第四季度发布 - will)。

    但是对于这么简单的总和,我不会费心存储冗余信息。

    如果您不想重复表达式,请创建一个视图。

    【讨论】:

    • “存储冗余信息”我猜会假设即将发布的 Postgres 版本中的计算列不是虚拟的(它可以是虚拟的,例如在 MySQL 中)+1。
    • @TimBiegeleisen:两者都有。您可以将其定义为“虚拟”或“存储”。
    【解决方案2】:

    我认为你想要的是一个视图。

    CREATE VIEW table_with_sum AS 
     SELECT id, a, b, a + b as total FROM summedup;
    

    然后您可以在视图中查询总和。

    SELECT total FROM table_with_sum where id=5;
    

    视图不存储每一行​​的总和,每次查询视图时都会计算total列。如果您的目标是提高查询效率,这将无济于事。

    还有另一种方法:将列添加到表中并为更新和插入创建触发器,以在每次修改行时更新total 列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-26
      • 1970-01-01
      • 2020-08-13
      • 2019-11-05
      相关资源
      最近更新 更多