2016-11-28 7 views
0

그래서 아래 열이 포함 된 테이블이 있습니다. positiondate에서 실행 평균을 계산하고 싶습니다 (예 : 3 일 전, dealno에 그룹화). 나는 "사례별로"하는 법을 알고 있지만, 문제는 약 200 개의 다른 DealNo가 있으므로 모든 거래에 대해 자신 만의 case by 절을 쓰고 싶지 않다는 것입니다.SQL 2008 그룹 별 평균 실행

는 dealNo 1에서 그 출력은 I 스크립트 이하 시도했지만 내 테이블 주위 300K 행을 포함하고 있기 때문에 매우 효과적 아니었다 (149 (243) 440 + 149 224 446 + 149 243 451)

DealNo  PositionDate MarketValue 
    1 | 2016-11-27 | 149 243 440 
    2 | 2016-11-27 | 21 496 418 
    3 | 2016-11-27 | 32 249 600 
    1 | 2016-11-26 | 149 243 446 
    2 | 2016-11-26 | 21 496 418 
    3 | 2016-11-26 | 32 249 600 
    1 | 2016-11-25 | 149 243 451 
    3 | 2016-11-25 | 32 249 600 
    2 | 2016-11-25 | 21 496 418 
    3 | 2016-11-24 | 32 249 600 
    1 | 2016-11-24 | 149 225 582 
    2 | 2016-11-24 | 21 498 120 
    1 | 2016-11-23 | 149 256 867 
    2 | 2016-11-23 | 21 504 181 
    3 | 2016-11-23 | 32 253 440 
    1 | 2016-11-22 | 149 256 873 
    2 | 2016-11-22 | 21 506 840 
    3 | 2016-11-22 | 32 253 440 
    1 | 2016-11-21 | 149 234 535 
    2 | 2016-11-21 | 21 509 179 
    3 | 2016-11-21 | 32 253 600 

평균되어야 원하는 그리고 약 200 다른 dealno. SQL 2008에서 더 효과적인 방법이 있습니까?

with cte as (

SELECT ROW_NUMBER() over(order by dealno, positiondate desc) as Rownr, 
     dealno, 
     positiondate, 
     Currency, 
     MvCleanCcy 
    FROM T1 
      ) 

select 
rownr, positiondate, DealNo, Currency, 
mvcleanavg30d = (select avg(MvCleanCcy) from cte2 where Rownr between c.Rownr and c.Rownr+3) 

from cte as c 
+0

'149 243 440'이란 무엇입니까? 그 번호 하나 또는 세입니까? –

답변

1

윈도우 기능이 필요하지 않습니다. outer apply :

select t1.*, tt1.marketvalue_3day 
from t1 outer apply 
    (select avg(tt1.marketvalue) as marketvalue_3day 
     from (select top 3 tt1.* 
      from t1 tt1 
      where tt1.deal1 = t1.deal1 and 
        tt1.positiondate <= t1.positiondate 
      order by tt1.positiondate desc 
      ) tt1 
    ) tt1;