2016-10-17 3 views
3

이전 레코드의 매개 변수를 사용하여 산술 계산이 필요한 열의 이동 평균을 계산하고 싶습니다.이전 레코드를 변수로 사용하여 이동 평균 계산하기

나는 Y는 항상 이전 기록에서 읽는 미터

(reading x - reading y)/(reading date @ x - reading date @ y) 

공식

을 사용하여 날짜와, 내가 평균 속도를 결정하는 계산을 수행 할, 미터 독서 X에 대한 기록이있다. DATEDIFF는 일입니다. 내가 판독 2 년이 있고, 처음되지 이후 -

Meter | Reading | Date 
-------+---------+------------ 
    1 | 39,000 | 1 Jan 2016 
    1 | 39,200 | 1 Feb 2016 
    1 | 39,300 | 1 Mar 2016 

나는 추가로 계산 된 필드를 삽입 열이 최신 기록에서 읽을 것 , 뒤로 과정을하고 싶습니다.

Meter | Reading |  Date |  Rate 
------+---------+------------+-------------------- 
    1 | 39,000 | 1 Aug 2016 | (200/31) = 6.45 
    1 | 39,200 | 1 Sep 2016 | (100/30) = 3.33 
    1 | 39,300 | 1 Oct 2016 | Z 

보고 용으로 이것을 선택하고 싶습니다.

- 편집 -

내가 0 오류로 나누기를 얻고 독서 X를 계산하기로 결정했다 - ReadingDiff로 별도로 Y 읽기. 난 MeterID (1)의 마지막 기록 및 MeterID 2의 제 레코드 사이 MeterDiff를 계산하는 것을 방지 할 방법을 선택리스트에서 1 개 이상의 MeterIDs이 있으므로

LEAD(MeterReading, 1, 0) OVER (PARTITION BY MeterID ORDER BY MeterReading) - MeterReading AS MeterDiff

? 각 MeterID의 첫 번째 레코드를 0으로 설정할 수 있습니까? SQL 서버는 정수 나눗셈을 수행하기 때문에, 읽기가 정수의 경우

select t.*, 
     ((reading - lag(reading) over (partition by meter order by date))/
     nullif(datediff(day, lag(date) over (partition by meter order by date), date), 0) 
     ) 
from t; 

, 다음주의 :

+0

태그 'tsql'은 (는)'sql-server'를 가리 킵니다. 그러나 어떤 버전입니까? – Shnugo

+0

@Shnugo - 2012 년과 2014 년을 사용하고 있습니다. 창 프레임 기능을 사용할 수 있다고 생각합니까? –

답변

4

이 같은 것입니다. 그래서, 당신은 할 수 있습니다 :

select t.*, 
     ((1.0*reading - lag(reading) over (partition by meter order by date))/
     nullif(datediff(day, lag(date) over (partition by meter order by date), date), 0) 
     ) 
from t; 

참고 : lag()은 그 이전 버전에 2012 년부터 SQL 서버에서 구현 ANSI 표준 기능, 당신은 outer apply으로,보다 연산 집약적 인 방법을 사용해야합니다.

+0

고든 고마워, 내가 찾고 있었던 것이었다. –

+0

나는 0 오류로 나누기를 얻었고 ReadingDiff로 Reading X - Reading Y를 따로 계산하기로 결정했습니다. LEAD (MeterReading, 1, 0) OVER (MeterRead에서 MeterReading에 의한 분할) - MeterReading AS MeterDiff 선택 목록에 MeterID가 두 개 이상 있기 때문에 마지막 레코드 사이에 MeterDiff를 계산하지 못하게하는 방법은 무엇입니까? MeterID 1과 MeterID 2의 첫 번째 레코드는? 각 MeterID의 첫 번째 레코드를 0으로 설정할 수 있습니까? –

+0

@IvanNel. . . 'NULLIF()는 0으로 나누기를 피하는 가장 쉬운 방법입니다. 'COALESCE()'를 사용하여 첫 번째 값을 0으로 설정할 수 있습니다. –