2015-02-05 3 views
3

사용하여 포스트 그레스 9.3 ... 내가 중첩되지 배열에 직접 최대 기능을 사용할 수없는 이유Postgres : int 배열에서 최대 값 찾기?

누군가가 설명해 주시겠습니까 ..?

불충분 한 함수는 select 문과 마찬가지로 "setof"를 리턴한다는 것을 이해합니다. 그러면이 쿼리의 짧은 버전이 작동하지 않는 이유는 무엇입니까? (개념적으로 뭔가가 없거나 구문과 관련된 문제입니까?)

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

+1

예, 있습니다. 'max'는 집합체이므로 튜플 당 하나의 입력에 대해 연산을합니다. 그것은 그처럼 입력으로 집합을 취할 수 없습니다. 표현 방법을 설명하기 위해 'select id (unest (history) x에서 max (x)를 foo_history에서 vmax로 선택'과 같은 부질의를 사용할 것입니다. –

답변

0

SQL은 데이터 집합에서 작동하도록 설계되었습니다. MAX 함수는 실제로 첫 번째 예제에서 작동하지만 예상대로 작동하지 않습니다. 일치하는 각 행의 최대 값을 리턴합니다.

group by 절은 이제 집합으로 집계하고 집합에서 최대 값을 얻으므로 예상대로 작동합니다. :)

+0

내 _2nd_ 예제는 수백만 개의 레코드가있을 수 있다고 생각할 때 매우 비효율적 인 것처럼 보입니다. 종류가 거꾸로 보인다 ... ?? 어쩌면 사용자 정의 함수가이 경우 갈 수있는 방법입니다 ... – user2259963

+0

귀하의 의견을 바탕으로, 다음 최고의 기능을 작동해야하지만 그 중 하나를 작동하지 않습니다. 두 함수 모두 반환 ... '오류 : 집합을 수락 할 수없는 컨텍스트에서 호출 된 값 반환 함수' – user2259963

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); 
$$ 

을하고를 사용

PostgreSQL의 9.6 및 8.4에서
SELECT id, array_greatest(history) as vMax 
FROM foo_history; 
+0

감사. 이 글을 쓰고 난 직후 배열에서 가장 큰 값의 위치를 ​​반환하는 비슷한 함수를 작성했습니다. 그러나 특별히 어려운 것은 아니었지만 이미 내장 된 다른 모든 기능에 놀랐습니다.이 단순한 기능은 아직 지원되지 않았습니다. – user2259963

+0

@ user2259963 모든 기능과 유틸리티는 누군가에 의해 작성되어야하며 누군가가 잘못 작성하고 싶지 않은 경우 작성되지 않습니다.이 특별한 경우에는 곧 다시 시도하겠습니다. 마지막으로 Pg를 코딩 한 것에 대해 많은 것을 배웠습니다.이 코드를 핵심으로 지원하고 싶습니다. –

+0

다른 사람이 필요하다는 것을 알게되어서 고맙습니다. 내가 도울 수 있는지 알려줘. 불행히도 필자의 경우 레코드 세트와 행 세트의 근본적인 차이점을 아직 이해하지 못하고 있습니다. 레코드 세트를 배열로 바꾸는 것은 매우 쉽지만 다른 방법은 아닙니다. 우리가 다른 방향으로 가면 데이터는 기존 집계 함수에 의해 지원 될 것입니다. 이제는 배열 하위 집합의 표준 편차를 계산하는 함수를 만들고 있습니다. :) – user2259963

0

: 나는 내 자신의 기능을 썼다하더라도

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

우리가 9.6에 도달하면, 그것은 좋을 것입니다! – user2259963

+0

PostgreSQL 8.4에서 작동하는지 확인했습니다. –