2015-02-05 494 views
3

使用的是Postgres 9.3 ...Postgres:在int數組中尋找最大值?

是否有人可以解釋爲什麼我不能在嵌套的陣列上直接使用最多的功能..?

這是我的理解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; 
+0

雖然我寫我自己的函數所以解決這個問題,我還是有點困惑。 'unnest'函數返回一組行,並且max函數對一組行進行操作。有沒有一個錯誤,或者有什麼我只是沒有得到? – user2259963 2015-02-06 17:35:48

+1

是的,有。 'max'是一個聚集,所以它每個元組都有一個輸入。它不能像這樣輸入一個集合。要做你描述你表達它的方式,你需要使用一個子查詢,比如'select id,(從unnest(history)x)中選擇max(x)作爲foo_history'的vmax。 – 2015-02-07 04:42:53

回答

0

您必須記住SQL旨在對數據集進行操作。 MAX函數實際上在第一個例子中起作用,它不會像你期待的那樣工作。它將返回匹配的每一行的最大值。

group by子句按預期工作,因爲您現在將聚合到一個集合中,然後從該集合中獲取最大值。 :)

+0

看起來像我的_2nd_例子是非常低效的,當你考慮可能有數百萬條記錄。有點似乎倒退...?也許一個自定義函數是在這種情況下去... – user2259963 2015-02-05 18:35:22

+0

根據您的評論,然後最大的功能應該工作,但這也不起作用。這兩個函數都返回...'錯誤:上下文中調用的set-valued函數不能接受集合' – user2259963 2015-02-05 18:51:29

4

如果您安裝了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; 
+0

謝謝。寫完這些之後,我寫了自己的類似函數,返回數組中最大值的位置。然而,這並不是特別困難,我對已經內置的所有其他功能感到驚訝,這種簡單的事情尚未得到支持。 – user2259963 2015-02-06 14:52:13

+0

@ user2259963每個功能和實用程序都必須由某人編寫,如果有人不太需要它,它就不會被寫入。在這個特定的例子中,我會盡快再試一次,自從上次我去了這裏之後,我學到了很多關於Pg編碼的知識,並且我希望看到它在覈心中得到支持。 – 2015-02-07 04:41:12

+0

我明白別人看到的需要。讓我知道如果我能幫忙。不幸的是,在我的情況下,我仍然不理解我認爲是記錄集和行集之間的根本區別。把記錄集合變成一個數組很容易 - 但不是相反;如果我們走另一條路,數據將被現有的聚合函數所支持。現在我正在開發一個函數來計算數組子集的標準偏差。 :) – user2259963 2015-02-11 19:23:25

0
在PostgreSQL的9.6和8.4

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

當我們達到9.6時,那會很棒! – user2259963 2017-07-11 19:59:21

+0

我剛剛檢查過它可以在PostgreSQL 8.4上運行 – 2017-07-13 14:34:37