首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TSQL Group-By超过两列

TSQL Group-By超过两列
EN

Stack Overflow用户
提问于 2011-01-26 23:22:47
回答 2查看 2.9K关注 0票数 3

嗨,提前谢谢你的帮助。我有下表:

代码语言:javascript
复制
create table temp_vol (symbol nchar(10), dseqkey int, volume float)

以下是表中的一些值:

代码语言:javascript
复制
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 

我正在寻找的输出是每个符号、每个dseqkey的2天简单移动平均值((volume dseqkey + volume dseqkey-1) / 2)。我可以得到一个dseqkey中所有符号的移动平均值。我可以得到一个符号上所有dseqkey的移动平均值。我似乎不能让两者一起工作。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-26 23:31:25

您可以使用row_number()为每一行指定一个数字。这允许您查找前一行。为3值移动平均值编辑的示例:

代码语言:javascript
复制
; 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

这将打印:

代码语言:javascript
复制
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

测试数据:

代码语言:javascript
复制
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 )
票数 2
EN

Stack Overflow用户

发布于 2011-01-26 23:32:57

我的计算机上没有数据库引擎,所以我不能确定这一点:

在评论之后更新了

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4806262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档