返回信息流题目是这样的:
一个股价schema StockPrice (stockid, timeid, price)
timeid 是开盘的第x天, 第x天的股价price可以通过where timeid =x 获得
如果某个股票价格:
timeid price
5 10
6 12
7 14
那么两天内均价是:
timeid 2-day moving average
6 11.0000000000000000
7 13.0000000000000000
现在需要输出15-day moving average,按照stockid升序排序
1.因为题目要求15天均价,所以前14天是没法求均价的,所有股票从第15天后开始求均价
2.如果某一天股价是null,那么那一天往后算的15天之内,求出的数据都放弃(少一天的值那么结果是不对的)
这个怎么用sql语句实现? 我初学数据库,还没掌握sql语句,想了很久思维比较混乱,请指教.
这是一条镜像帖。来源:北邮人论坛 / database / #3792同步于 2009/9/3
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Database机器人发帖
请教一个sql语句
cm536
2009/9/3镜像同步3 回复
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
对于 MA 的计算还是有一些逻辑在里面的,不建议把所有的工作都交给 DBMS 来完成
可以得到时间窗口的所有数据,然后由应用程序来完成计算
【 在 cm536 (电) 的大作中提到: 】
: 题目是这样的:
: 一个股价schema StockPrice (stockid, timeid, price)
: timeid 是开盘的第x天, 第x天的股价price可以通过where timeid =x 获得
: ...................
----首先去掉price IS NULL 的记录,这样关联就不用判断为空的情况了
DELETE FROM StockPrice WHERE price IS NULL ;
----最开始的sql是这样的
SELECT T1.stockid ,T1.TIMEID ,(T1.PRICE + T2.PRICE +T3.PRICE ,+......T15.PRICE )/ 15
FROM StockPrice T1 ,StockPrice T2,StockPrice T3,....StockPrice T15
WHERE T1.TIMEID >= 15
AND T1.TIMEID = T2.TIMEID+1
AND T1.TIMEID = T3.TIMEID+2
.........
AND T1.TIMEID = T15.TIMEID+14
----这样的笛卡尔积是一个很大的数,显然是难以接受的
----于是只能逐步减小
----先算一个3天的平均股价
INSERT INTO DAY3_StockPrice(stockid ,TIMEID,PRICE )
SELECT T1.stockid ,T1.TIMEID ,(T1.PRICE + T2.PRICE +T3.PRICE )/ 3
FROM StockPrice T1 ,StockPrice T2,StockPrice T3
WHERE T1.TIMEID >= 15
AND T1.TIMEID = T2.TIMEID+1
AND T1.TIMEID = T3.TIMEID+2
----6日的平均股价就是这样的了
INSERT INTO DAY6_StockPrice(stockid ,TIMEID,PRICE )
SELECT T1.stockid ,T1.TIMEID ,(T1.PRICE + T2.PRICE )/ 2
FROM DAY3_StockPrice T1 ,DAY3_StockPrice T2
WHERE T1.TIMEID >= 15
AND T1.TIMEID = T2.TIMEID+3
----9日的就是
INSERT INTO DAY9_StockPrice(stockid ,TIMEID,PRICE )
SELECT T1.stockid ,T1.TIMEID ,(6*T1.PRICE + 3*T2.PRICE )/ 9
FROM DAY6_StockPrice T1 ,DAY3_StockPrice T2
WHERE T1.TIMEID >= 15
AND T1.TIMEID = T2.TIMEID+6
----12日和15日的往下类推
----12日的可以用2个6日均的均值求得