2011-01-26 5 views
3

Bonjour Merci d'avance pour votre aide. Je le tableau suivant:Groupe TSQL par deux colonnes

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

voici quelques valeurs du tableau:

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 

La sortie que je suis à la recherche est un dseqkey-1 2 jours moyenne mobile simple ((volume dseqkey + le volume)/2) pour chaque symbole, pour chaque dseqkey. Je peux obtenir la moyenne mobile fonctionnant pour tous les symboles à travers un dseqkey. Je peux obtenir la moyenne mobile fonctionnant pour tous les dseqkeys à travers 1 symbole. Je n'arrive pas à faire travailler les deux ensemble.

Répondre

2

Vous pouvez attribuer un numéro à chaque ligne en utilisant row_number(). Cela vous permet de rechercher la ou les lignes précédentes. Exemple modifié pour une 3 valeur moyenne mobile:

; 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 

Cette impression:

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 

données de test:

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: L'exemple SQL utilise maintenant une moyenne mobile de 3 jours, vous pouvez l'étendre à 30 en changeant 'cur.rn-2' à' cur.rn - 29' – Andomar

+0

Cette partie de la description suggère que Les valeurs de 'dseqkey' sont garanties sans avoir de trous:' une moyenne mobile simple de 2 jours ((volume dseqkey + volume dseqkey-1)/2) '. Dans ce cas, la solution d'Andomar peut être utilisée sans CTE + ROW_NUMBER() '. Après avoir supprimé la section 'WITH', je crois que' numbered' devrait être remplacé par 'temp_vol', et' rn' par 'dseqkey'. –

0

Je ne suis pas sur un ordinateur avec un moteur de base de données, Je ne peux pas être sûr de cela:
MIS À JOUR commentaire suivant

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

Ce qui précède semble le plus proche merci. Quand j'ai commencé à publier, j'ai utilisé une moyenne mobile de 2 jours pour simplifier le problème. Je suis vraiment à la recherche d'une moyenne mobile de 30 jours. Par conséquent, ce qui précède est proche, mais je pense que j'ai besoin de la fonction d'agrégat AVG pour faire ce travail? Voici les deux requêtes qui fonctionnent actuellement, je ne peux pas obtenir les requêtes/résultats combinés pour ce dont j'ai vraiment besoin. 1) sélectionnez SYMBOL, AVG (Volume) AS VOLAVG30 à partir de temp_vol où dseqkey ENTRE 20642 ET 20673 groupez par symbole ORDER BY Symbole ASC –

+0

2) SELECT x.dseqkey, AVG (y.VOLUME) moving_average FROM temp_vol x, temp_vol y O WH x.dseqkey> = 30 ET x.dseqkey ENTRE y.dseqkey ET y.dseqkey + 29 ET Y.Symbol = X.Symbol ET X.Symbol = 'C' GROUP BY x.dseqkey COMMANDER PAR x.dseqkey DESC –

+0

Désolé pour le retard, mais je ne veux pas sur un ordinateur. Ok, j'ai changé la requête, donc cela devrait refléter ce que vous commentez. Laissez-moi savoir si cela fonctionne – Lamak