使用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;
答案 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)
:
SELECT max(x) FROM unnest(ARRAY[1,2,80,3,15,4]) as x;
答案 2 :(得分:0)
您必须记住,SQL旨在对数据集进行操作。 MAX函数实际上在第一个例子中起作用,它只是不像你期望的那样工作。它将返回匹配的每一行的最大值。
group by子句按预期工作,因为您现在聚合到一个集合中,然后从集合中获取最大值。 :)