postgresql Postgres:在整型数组中查找最大值?

gz5pxeao  于 2022-11-22  发布在  PostgreSQL
关注(0)|答案(4)|浏览(244)

正在使用Postgres 9.3...

有人能解释一下为什么我不能直接在非嵌套数组上使用max函数吗?
我的理解是unnest函数返回一个“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;
y0u0uwnf

y0u0uwnf1#

如果你安装了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(elements) FROM unnest($1) elements
$$;

并使用:

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

ovfsdjhp2#

在PostgreSQL 9.6和8.4中:

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

gjmwrych3#

你必须记住,SQL是设计来对数据集进行操作的。MAX函数在第一个例子中实际上是有效的,只是它没有像你期望的那样工作。它将返回匹配的每一行的最大值。
group by子句按预期方式工作,因为您现在要聚合到一个集合中,然后从该集合中获取最大值。:)

2eafrhcq

2eafrhcq4#

这对我有用

select *,
(SELECT max(a) from unnest(ARRAY[1,2,80,3,15,4]) a ) as mx,
 from table

这将在数组中找到max

相关问题