2014-09-09 8 views
0

이 곳곳에 이런 질문이있어서 도움이 필요한 곳을 구체적으로 설명해 드리겠습니다.조인만으로 일 이동 평균

오라클 분석 기능, MSSQL 적용 또는 다양한 방법으로 SQL에서 이동 평균을 보았습니다. 나는 또한 자기 조인 (여기서는 How do you create a Moving Average Method in SQL?과 같은 평균의 각 일에 대한 하나의 조인)을 통해 이것을 수행하는 것을 보았습니다.

SQL (바람직하게는 오라클을 선호하지만 내 질문은 혼자만 조종하는 것이므로 모든 RDBMS에서 가능해야 함)에서이 작업을 수행하는 방법이 있는지 궁금합니다. 방법은 확장 가능해야합니다 (이동 평균에서 매일에 대한 조인이 필요한 위에서 연구 한 링크와 달리 20 또는 100 일 이동 평균의 경우).

내 생각은

select customer, a.tradedate, a.shares, avg(b.shares) 
from trades a, trades b 
where b.tradedate between a.tradedate-20 and a.tradedate 
group by customer, a.tradedate 

이다하지만 과거에 그것을 시도 할 때 그것은 작동하지 않았다. 좀 더 구체적으로 말하자면,이 바이올린 데모와 함께 작지만 비슷한 예제 (20 일 대신 평균 5 일)를 시도하고 있으며, 내가 잘못 가고있는 곳을 찾을 수 없습니다. http://sqlfiddle.com/#!6/ed008/41

select a.ticker, a.dt_date, a.volume, avg(b.volume) 
from yourtable a, yourtable b 
where b.dt_date between a.dt_date-5 and a.dt_date 
and a.ticker=b.ticker 
group by a.ticker, a.dt_date, a.volume 

답변

0

, 나는 볼륨 필드가 정수 데이터이기 때문에 그렇지 않은 유일한 이유는 당신이 기다리고있어하는 생각에 참여하지 따라서 평균을 계산할 때 결과 출력도 정수 데이터 유형이됩니다.

select a.ticker, a.dt_date, a.volume, avg(cast(b.volume as float)) 
    from yourtable a 
    join yourtable b 
    on a.ticker = b.ticker 
where b.dt_date between a.dt_date - 5 and a.dt_date 
group by a.ticker, a.dt_date, a.volume 

바이올린 : http://sqlfiddle.com/#!6/ed008/48/0 (DDL에 대한 @DaleM 감사는)

I 평균 위해 당신은 결과가 반드시 정수 (정수) 수 없기 때문에, 캐스팅해야 특히 분석 함수가있는 오라클에서이 작업을 수행하려는 언급이 있기 때문에 분석 함수와 비교하여이 작업을 수행하는 이유를 알 수 없습니다. 선호하는 데이터베이스가 MySQL 또는 분석 기능이없는 데이터베이스 인 경우에는 다릅니다.

답변을 추가하기 만하면 분석 기능을 사용하여 Oracle에서 동일한 결과를 얻을 수 있습니다. PARTITION BY가 티커에서 사용중인 조인으로 사용되는 방식에 주목하십시오. 이렇게하면 여러 개의 시세 표시기에 걸쳐 공유되는 동일한 날짜가 간섭하지 않도록 결과가 분할됩니다.

select ticker, 
     dt_date, 
     volume, 
     avg(cast(volume as decimal)) over(partition by ticker 
              order by dt_date 
              rows between 5 preceding 
                and current row) as mov_avg 
    from yourtable 
order by ticker, dt_date, volume 

바이올린 : http://sqlfiddle.com/#!4/0d06b/4/0

분석 기능을 가능성이 훨씬 빠르게 실행됩니다.

+0

감사합니다. 정확히 내가 무엇을 찾고 있었는지. – jfalkson

0

http://sqlfiddle.com/#!6/ed008/45이 필요한 것으로 보입니다.

select a.ticker, 
     a.dt_date, 
     a.volume, 
     (select avg(cast(b.volume as float)) 
     from yourtable b 
     where b.dt_date between a.dt_date-5 and a.dt_date 
       and a.ticker=b.ticker) 
from yourtable a 
order by a.ticker, a.dt_date 

는하지만 내가 두 번째 쿼리 아무 잘못 표시되지 않는 하위 쿼리

+0

고맙습니다. 내가 조인 언급했는데, 내 질문의 정신은 SQL의 기본 요소를 사용하여이 문제를 해결하는 것이 중요하며, 종속 하위 쿼리가 여기에 포함될 것입니다. 하위 쿼리없이 자체 조인만으로이 작업을 수행 할 수 있습니까? – jfalkson