200 개 이상의 국가에 대한 연간 값이있는 테이블이 있습니다. 그래픽 표현의 경우 1990 년과 2013 년의 두 특정 연도 사이의 백분율 변화를 얻고 싶습니다.
표는 다음과 같습니다.
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 = 2013
에 의해 year = 1990
이들 국가의 각.
해당 테이블 (추가 열로 표시됨)에 여러 변수가 있으므로 id_source = 1
또는 id_source = 2
, 또는 id_sector = 1
또는 같은 추가 열 값으로 필터링해야하므로 더 복잡해질 수 있습니다 id_sector = 2
.
어떤 도움이라도 대단히 감사합니다!
아마도 가장 빠른 한 가지 방법 :
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 ???
이것은 1990 년의 모든 국가에 대해 0보다 큰 값을 가지고 있다고 가정합니다 . 그렇지 않으면 0으로 나눕니다. 나는 NULLIF
예제에서 그것을 방어 합니다. 이 경우 결과는 NULL입니다.
pct
는 1990 년 대비 2013 년 값의 백분율입니다. 백분율 변화 를 구하려면 여기 에서 100을 뺍니다. 정확히 필요한 것이 무엇인지 확실하지 않습니다.
round()
분수를 줄이는 데 사용할 수 있습니다 .
집계 FILTER
절은 Postgres 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);
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다