2017-04-10 2 views
1

제목이 잘못되었지만 내 문제를 설명하는 간결한 방법을 생각할 수 없습니다.단일 열의 다른 값을 새 열로 뺄 수있는 쿼리 만들기

나는 다음과 같은 열이있는 테이블이 :

내가 1 년/월의 모든 basin_ids의 값을 다른 년/월의 모든 basin_ids에 해당하는 값이에서 뺄 필요가
year | month | basin_id | value 

, 결과 값을 각각의 basin_ids와 여전히 연관되는 방식으로 저장합니다. 그것은 오히려 간단한 쿼리/하위 쿼리해야 같은

이는 것, 그리고 내가 가진 잘 값의 차이를 계산할 수 있습니다

SELECT (val1.value-val2.value) 
FROM value_table_1 as val1, 
    value_table_2 as val2 
WHERE val1.basin_id=val2.basin_id 
value_table_1 및 value_table_2 내가 모든 분리하는 의해 한 임시 테이블입니다

내 쿼리를 단순화하기 위해 year1/month1 및 year2/month2와 관련된 값.

내 문제는 모든 새로운 값을 가진 열을 얻을 수 있지만 관련 유역이 아닙니다. 이것을 어떻게 할 수 있습니까? 그게 도움이된다면 plpgsql 스토어드 프로 시저 내에이 글을 쓰고있다.

year | month | basin_id | value 
-----+-------+----------+------- 
2017 | 04 | 123 | 10 
2017 | 04 | 456 | 6 
2017 | 05 | 123 | 12 
2017 | 05 | 456 | 4 

을 내가 입력 주어진 해요 : :

basin_id | value 
----------+------ 
    123 | -2 
    456 | 2 
+1

질문을 편집하고 샘플 데이터와 원하는 결과를 제공하십시오. –

답변

1
:

year1 := 2017 
month1 := 04 
year2 := 2017 
month2 := 05 

나는 결과로 다음 표를 얻으려면을

다음과 같이 내 테이블 인 말

당신이 이걸 좋아할 것 같아요.

CREATE TABLE foo 
AS 
    SELECT * 
    FROM (VALUES 
    (2010, 02, 5, 8), 
    (2013, 05, 5, 3) 
) AS t(year, month, basinid, value); 

CREATE TEMPORARY TABLE bar 
AS 
    SELECT basinid, 
    f1.year AS f1y, f1.month AS f1m, 
    f2.year AS f2y, f2.month AS f2m, 
    f1.value-f2.value AS value 
    FROM foo AS f1 
    INNER JOIN foo as f2 
    USING (basinid); 

basinid | f1y | f1m | f2y | f2m |  value 
---------+------+-----+------+-----+---------- 
     5 | 2010 | 2 | 2010 | 2 |  0 
     5 | 2010 | 2 | 2013 | 5 |  5 
     5 | 2013 | 5 | 2010 | 2 |  -5 
     5 | 2013 | 5 | 2013 | 5 |  0 
(4 rows) 

SELECT * 
FROM bar 
WHERE f1y = 2013 
    AND f1m = 5 
    AND f2y = 2010 
    AND f2m = 2; 
+0

이것은 꼭 필요한 것 같습니다. 대단히 고마워, 내가 대답 할 때 대답을 받아 들일거야. –

+1

마지막 질문 하나만 죄송합니다. 쿼리 할 수 ​​있도록 값의 마지막 열에 어떻게 이름을 부여 할 수 있습니까? 수정 : "f1.value-f2.value"문 끝 부분에 "값으로"추가했습니다. –

관련 문제