Postgres:在int数组中查找最大值?

时间:2015-02-05 18:23:24

标签: arrays postgresql max postgresql-9.3

使用Postgres 9.3 ......

有人可以解释为什么我不能直接在unnested阵列上使用max函数..?

根据我的理解,不需要的功能会返回" setof"就像select语句一样。那么为什么这个查询的简短版本不起作用? (我是否在概念上遗漏了某些内容,或者我的问题与语法有关?)

table: foo_history: 

id | history::smallint
----------------------------------- 
1  |  {10,20,30,50,40}

这不起作用吗?

Select id, max(unnest(history)) as vMax from foo_history;

......但这个确实......?

WITH foo as (
    select id, unnest(history) as history 
    from foo_history
)
Select 
    id, max(history) as vMax
From foo 
Group by id;

3 个答案:

答案 0 :(得分:6)

如果您安装intarray模块,它会提供一些额外的数组运算符,让您可以编写您想要的内容,尽管效率不高:

CREATE EXTENSION intarray;

SELECT id, (sort_desc(history))[1] as vMax
FROM foo_history;

编写要添加到intarray的数组的最大函数和最少函数会非常容易,代码非常简单。

否则你可以写一个SQL函数:

CREATE OR REPLACE FUNCTION array_greatest(anyarray)
RETURNS anyelement LANGUAGE SQL AS $$
SELECT max(x) FROM unnest($1);
$$

并使用:

SELECT id, array_greatest(history) as vMax
FROM foo_history;

答案 1 :(得分:3)

PostgreSQL 9.6和8.4中的

SELECT max(x) FROM unnest(ARRAY[1,2,80,3,15,4]) as x;

答案 2 :(得分:0)

您必须记住,SQL旨在对数据集进行操作。 MAX函数实际上在第一个例子中起作用,它只是不像你期望的那样工作。它将返回匹配的每一行的最大值。

group by子句按预期工作,因为您现在聚合到一个集合中,然后从集合中获取最大值。 :)