2016-10-31 2 views
0

200 개 이상의 국가에 대한 연간 값이있는 표가 있습니다. 그래픽 표현을 위해, 나는이 두 가지 특정 년, 1990 년과 2013 년Postgres에서 두 행 사이의 변경 비율을보기로 계산합니다.

테이블 사이의 비율 변화를 좀하고 싶습니다 것은 조금 다음과 같습니다

id_country  year  value 
    886   2002  161.348 
    886   2003  161.348 
    886   2004  176.016 
    886   2005  176.016 
    886   2006  179.683 
    886   2007  183.35 
    886   2008  201.685 
    886   2009  227.354 
    886   2010  234.688 
    886   2011  245.689 
    886   2012  293.36 
    886   2013  440.04 
    620   1990  40.337 
    620   1991  1056.096 
    620   1992  1151.438 
    620   1993  1389.793 
    620   1994  1584.144 
    620   1995  1631.815 
    620   1996  1749.159 
    620   1997  1796.83 
    620   1998  1906.84 
    620   1999  1664.818 
    620   2000  1642.816 
    620   2001  2016.85 
    620   2002  1760.16 
    620   2003  1873.837 
    620   2004  1961.845 
    620   2005  2310.21 
    620   2006  2328.545 
    620   2007  2361.548 
    620   2008  3329.636 
    620   2009  3069.279 
    620   2010  3098.615 
    620   2011  2823.59 
    620   2012  3373.64 
    620   2013  2948.268 

나는 가장 좋은 방법가 될 것이라고 생각 그 차이를 계산하는 id_country과 함께 VIEW를 생성하십시오. 그러나 나는 그 쿼리가 어떻게 생겼는지 전혀 모른다. 모든 국가에서 SELECT을 입력해야하며 year = 2013year = 1990으로 나눕니다.

id_source = 1 또는 id_source = 2 또는 id_sector = 1 또는 id_sector = 2 같이, 이러한 추가 열 값에 의해 필터링 될 필요하다 (추가 항목으로 표시)이 테이블에서 여러 변수가 있기 때문에보다 복잡 할 수있다.

어떤 도움을 주셔서 감사합니다. 아마 가장 빠른

답변

1

한 가지 방법은 :

CREATE VIEW pct_2013_1990 AS 
SELECT id_country 
    ,  (sum(value) FILTER (WHERE year = 2013) * 100) 
    /NULLIF(sum(value) FILTER (WHERE year = 1990), 0) AS pct 
FROM tbl 
WHERE year IN (1990, 2013) 
AND id_source = 1 -- ?? 
GROUP BY id_country 
-- ORDER BY ??? 

이것은 당신이 다른 사람이 0으로 나누기를 얻을, 1990 년에 모든 국가에 대한 값> 0을 가정합니다. 나는이 예에서 NULLIF을 가지고이를 방어합니다. 이 경우 결과는 NULL입니다.

pct은 1990 년 대비 2013 년 비율의 백분율입니다. 백분율 변경을 받으려면에서 100을 뺍니다. 정확히 무엇이 필요한지 잘 모르겠습니다.

소수 자릿수를 줄이려면 round()을 사용할 수 있습니다.

집계 FILTER

는 포스트 그레스 9.4에서 도입되었습니다 : 이전 버전에서는이 CASE 표현으로 대체 할 수

.

대신 집합 반환 함수를 사용하고 연도를 매개 변수화하여 모든 연도 집합에 적용 할 수 있습니다.

CREATE FUNCTION f_pct_calc(year1 integer, year2 integer) 
    RETURNS TABLE(id_country int, pct numeric) AS 
$func$ 
    SELECT t.id_country 
     ,  (sum(t.value) FILTER (WHERE year = $2) * 100) 
     /NULLIF(sum(t.value) FILTER (WHERE year = $1), 0) AS pct 
    FROM tbl t 
    WHERE t.year IN ($1, $2) 
    AND t.id_source = 1 -- ?? 
    GROUP BY t.id_country 
    -- ORDER BY ??? 
$func$ LANGUAGE sql STABLE; 

전화 :

SELECT * FROM f_pct_calc(1990, 2013); 
+0

와우, 멋지다! 정말 고마워. 작은 수정 :'FILTER' 절에서 'FILTER (2013 년)'(국가가 아닌)이어야합니다. – luftikus143

+0

@ luftikus143 : 고마워요. –

관련 문제