2011-01-26 3 views
3

안녕하세요. 도움을 주셔서 미리 감사드립니다. 여기 TSQL 그룹 - 두 개 이상의 열로

create table temp_vol (symbol nchar(10), dseqkey int, volume float) 

일부 테이블의 값은 다음과 같습니다 :

symbol  dseqkey volume (no commas in the actual values) 
C   20672  422,764,512 
F   20672  47,144,600 
F   20671  51,695,000 
C   20671  371,950,496 
F   20670  48,680,600 
C   20670  654,208,512 
C   20669  626,121,600 
F   20669  93,489,504 
C   20668  712,674,304 

내가 추구하고 출력 2 일 단순 이동 평균 ((볼륨 dseqkey + 볼륨 dseqkey-1 나는 다음과 같은 테이블이)/2) 각 기호에 대해 각 dseqkey에 대해. 하나의 dseqkey에서 모든 기호에 대해 이동 평균을 사용할 수 있습니다. 나는 모든 dseqkeys에 대해 움직이는 평균을 1 개의 심볼을 통해 얻을 수있다. 나는 함께 일하는 것 같지 않아.

답변

2

row_number()을 사용하여 각 행에 번호를 부여 할 수 있습니다. 그러면 이전 행을 검색 할 수 있습니다. 예 3 값 이동 평균 편집 :

; with numbered as 
     (
     select ROW_NUMBER() over (partition by symbol order by dseqkey) rn 
     ,  * 
     from temp_vol 
     ) 
select cur.symbol 
,  cur.dseqkey 
,  avg(window.volume) as MovingAverage 
from numbered cur 
join numbered window 
on  cur.symbol = window.symbol 
     and window.rn between cur.rn - 2 and cur.rn 
group by 
     cur.symbol 
,  cur.dseqkey 
order by 
     cur.symbol 
,  cur.dseqkey 

이 인쇄 :

symbol  dseqkey  MovingAverage 
---------- ----------- ---------------------- 
C   20668  712674304 
C   20669  669397952 
C   20670  664334805,333333 
C   20671  550760202,666667 
C   20672  482974506,666667 
F   20669  93489504 
F   20670  71085052 
F   20671  64621701,3333333 
F   20672  49173400 

테스트 데이터 :

if OBJECT_ID('temp_vol') is not null 
    drop table temp_vol 
create table temp_vol (symbol nchar(10), dseqkey int, volume float) 
insert temp_vol values 
('C', 20672, 422764512), 
('F', 20672, 47144600 ), 
('F', 20671, 51695000 ), 
('C', 20671, 371950496), 
('F', 20670, 48680600 ), 
('C', 20670, 654208512), 
('C', 20669, 626121600), 
('F', 20669, 93489504 ), 
('C', 20668, 712674304) 
+0

@ user590822 : 이제 샘플 SQL은 3 일 이동 평균을 사용하므로 'cur.rn - 2'를'cur.rn - 29'로 변경하여 30으로 확장 할 수 있습니다. – Andomar

+0

설명의이 부분은 'dseqkey' 값에는'2 일 간단한 이동 평균 ((볼륨 dseqkey + 볼륨 dseqkey-1)/2)'이 없도록 보장됩니다. 이 경우 Andomar의 솔루션은 CTE +'ROW_NUMBER()'없이 사용할 수 있습니다. 'WITH' 섹션을 제거한 후,'numbered'는'temp_vol'로,'rn'은'dseqkey'로 대체해야한다고 생각합니다. –

0

나는 데이터베이스 엔진 컴퓨터에 아니에요을, 그래서 나는 이것에 관해서 확신 할 수 없다 :
다음과 같은 덧글

SELECT A.symbol, A.dseqkey, AVG(B.volume) MovingAverage 
FROM temp_vol A 
LEFT JOIN temp_vol B 
ON A.symbol = B.symbol AND A.dseqkey BETWEEN B.dseqkey - 30 AND B.dseqkey 
GROUP BY A.symbol, A.dseqkey 
+0

위의 내용이 가장 감사합니다. 내가 처음 게시했을 때 문제를 전달하기 위해 2 일 이동 평균을 사용했습니다. 나는 정말로 30 일 이동 평균을 찾고있다. 따라서 위의 닫습니다하지만이 작업을 수행하려면 AVG 집계 함수가 필요하다고 생각합니까? 다음은 현재 작동하는 두 가지 쿼리입니다. 실제로 필요한 쿼리/결과를 얻을 수 없습니다. 1) temp_vol에서 SYMBOL, AVG (볼륨) AS VOLAVG30을 선택합니다. 여기서 dseqkey BETWEEN 20642 및 20673은 기호별로 정렬합니다. ORDER BY 기호 ASC –

+0

2) SELECT x.dseqkey, AVG (y.VOLUME) moving_average FROM temp_vol x, temp_vol y WHERE x.dseqkey> = 30 AND x.dseqkey y.dseqkey 및 y.dseqkey + 29 AND Y.Symbol = X.Symbol AND X.Symbol = 'C' GROUP BY x.dseqkey ORDER BY x.dseqkey DESC –

+0

지연에 대해 유감스럽게 생각하지만 컴퓨터에서 보지 못했습니다. 좋아, 내가 코멘트를 반영하도록 쿼리를 변경했다. 작동하는지 알려주세요. – Lamak

관련 문제