2016-10-25 7 views
2

날씨 데이터의 PostgreSQL 테이블에서 마지막 비와 그 날의 해당 비의 양을 계산하려고합니다. 창 함수를 사용하여이 작업을 수행하려고 시도했지만 범위를 제한하지 않아도 처리 방법이 달라질 수 있습니다.PostgreSQL에서 이동하는 날씨 통계 계산하기

SELECT 
     station_num, 
     ob_date, 
     rain, 
     max(rain) OVER (PARTITION BY station_num ORDER BY ob_date ASC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as prev_rain_mm, 
     '' as days_since_rain --haven't attempted this calculation yet 
FROM 
     obs_daily_ground_moisture 

이 결과는 다음과 :

postgres result

하지만 난 더 이런 식으로 뭔가를 달성하기 위해 노력하고있어 :

needed postgres result (edited manually)

는 여기에 지금까지 가지고있는 쿼리

창문과 관련하여 모든 조각이있는 것처럼 느껴집니다. 기능 범위 & 필터와 중첩 된 쿼리가 있지만 모두 함께 가져 오는 방법을 잘 모르겠습니다. 또한 위의 데이터는 실제 데이터 집합의 하위 집합이며 전체 데이터 집합은 50 만 개가 넘습니다.

+1

http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-question/285557# 285557 –

+0

@a_horse_with_no_name 코드 이미지를 붙여 넣지 않았습니다. 코드를 복사하여 붙여 넣기 할 수 있습니다. 테이블의 이미지를 게시했습니다. 테이블을 얻을 수있는 좋은 방법이 있으면 알려주세요. sqlfiddle로 샘플 데이터와 코드를 넣을 수는 있었지만 사이트를 게시 할 당시에는 테이블의 업로드 된 이미지를 보러갔습니다. 그 이유는 달성하려는 결과를 보여주기 때문입니다. – samuelf

답변

1

여기서 중요한 것은 rain> 0 값의 첫 번째 발생부터 시작하여 rain> 0 값의 다음 발생으로 관측을 그룹화하는 것입니다. 그런 다음 창 함수를 사용하여 필요한 열을 계산할 수 있습니다.

select 
x.station_num, 
x.ob_date, 
max(rain) over(partition by station_num,col) prev_rain, 
case when rain > 0 then 0 
else row_number() over(partition by station_num, col order by ob_date)-1 end days_since_rain 
from (select t.*, 
     sum(case when rain > 0 then 1 else 0 end) over(partition by station_num order by ob_date) col 
     from t) x 

Sample Demo

+0

감사합니다 vkp! 비가 내리기 전부터 며칠 동안 일을하는 것처럼 보입니다. 그러나 나는 이전의 비가를 얻으려는 아이디어가 있습니까? - max() 윈도우 기능은 제가 확신 할 때까지는 – samuelf

+0

입니다. . 편집 된 버전을 확인하십시오. 내부 쿼리에서 'col'계산은 기본적으로 rain> 0 값의 첫 번째 발생에서 다음 그룹의 rain> 0 값으로 관측치를 그룹화합니다. –

+0

덕분에 편집 된 버전을보기 전에 비가 내리는 날부터 코드를 사용하여 약간 다른 방식으로 작업했습니다. – samuelf

-1

이 시도.

 DECLARE @Rain AS FLOAT 

     UPDATE A 
     SET 
     @Rain = CASE WHEN A.Rain = 0 THEN @Rain ELSE A.Rain END, 
     A.Rain = CASE WHEN @Rain IS NULL OR A.Rain <> 0 THEN A.Rain ELSE @Rain END 
     FROM obs_daily_ground_moisture A 

     SELECT ob_date, Rain, 
     max(rain) OVER (PARTITION BY station_num ORDER BY ob_date ASC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as prev_rain_mm, 
     ROW_NUMBER() OVER(PARTITION BY Rain ORDER BY ob_date) - 1 as days_since_rain 
     FROM obs_daily_ground_moisture ORDER BY ob_date 
+1

OP가 postgresql을 사용 중입니다. 귀하의 대답은 MS SQL 서버에 대한 것 같습니다 – harmic