使用 AVG 计算数字列表的平均值

Jam*_*own 3 postgresql aggregate union

这可能是一个新手问题(请耐心等待),但是如何使用 SQL 和AVG函数计算数字列表的平均值?我的意思是,我可以将 SQL 中的数字相加,例如:

SELECT 2+3+4
Run Code Online (Sandbox Code Playgroud)

我如何计算平均的234没有将它们插入到表第一?

我尝试了不同种类的变体,例如:

SELECT 2 AS foo UNION 3 AS foo UNION 4 AS foo
  foo
  integer
1 2
2 3
3 4
Run Code Online (Sandbox Code Playgroud)

但:

SELECT AVG(SELECT 2 AS foo UNION 3 AS foo UNION 4 AS foo)
Run Code Online (Sandbox Code Playgroud)

错误:“选择”处或附近的语法错误

我似乎无法找到正确的语法。如果重要的话,我现在正在使用 PostgreSQL。

Erw*_*ter 6

最佳解决方案取决于值的来源和形式。

unnest()

将 set 返回函数unnest()FROM子句中的数组一起使用。对于长列表,这是最短的,但它是 Postgres 特定的解决方案。

SELECT avg(n) FROM unnest('{2,3,4}'::int[]) n;
Run Code Online (Sandbox Code Playgroud)

这是以下的简短语法:

SELECT avg(n) FROM unnest('{2,3,4}'::int[]) AS n(n);
Run Code Online (Sandbox Code Playgroud)

VALUES

或者,使用VALUES表达式作为子查询。这是标准的 SQL。

SELECT avg(n)
FROM  (VALUES (2),(3),(4)) t(n);
Run Code Online (Sandbox Code Playgroud)

UNION ALL

您可以使用更详细的SELECT ... UNION ALL SELECT .... 也是标准的 SQL。

SELECT avg(n)
FROM  (
   SELECT 2 
   UNION ALL
   SELECT 3
   UNION ALL
   SELECT 4
   ) t(n);
Run Code Online (Sandbox Code Playgroud)

使用,而不仅仅是,这会折叠重复项(您没有指定!),因此也相当昂贵。UNION ALLUNION

SQL小提琴。

请注意,示例中的所有数字文字都会integer自动转换为(仅数字)。对于其他数据类型,您可能必须添加显式类型转换。avg() 退货 (根据文件)

numeric对于任何整数类型参数,double precision对于浮点参数,否则与参数数据类型相同