spl和sql对比-九游会登陆
找出发生过连续三交易日涨停(涨幅>=10%)的股票
sql解法
with a as (select 代码,交易日, 收盘价/lag(收盘价) over(partition by 股票 order by 交易日)-1 涨幅 from 股价表), b as (select 代码, case when 涨幅>=0.1 and lag(涨幅) over(partition by 代码 order by 交易日)>=0.1 and lag(涨幅,2) over(partition by 代码 order by 交易日)>=0.1 then 1 else 0 end 三天连涨标志 from a) select distinct 代码 from b where 三天连涨标志=1
窗口函数可以计算出涨幅,再对涨幅施用窗口函数可计算出三天连涨标志,经过多层嵌套后终于可以计算出结果,多了一层分组导致复杂度陡增,还好有with把嵌套sql写成分步计算的样子。
spl解法
a | b | c | d | |
1 | =demo.query(“select * from 股价表”).group(代码).(~.sort(交易日期)) | =[] | 结果集在c1 | |
2 | for a1 | =0 | ||
3 | if a2.pselect(b2=if(close_price/close_price[-1]>=1.1,b2 1,0):3)>0 | 有三天涨停 | ||
4 | >c1=c1|a2.代码 |
或用子计算语句
a | b | |
1 | =股价表.group(代码).(~.sort(交易日期)) | |
2 | ==a1.select(?) | =0 |
3 | =~.pselect(b2=if(收盘价/收盘价[-1]>=1.1,b2 1,0):3)>0 | |
4 | =a2.(代码) |
天然可分步计算的spl在多一层分组时复杂度增加有限,使用子计算语句或循环将外层剥开,内层计算就如同平时层数少的情况一样,不会带来思维上的困难。
这段代码很容易扩展成寻找有n天连续涨停,而且找到第一个连续涨停日就停止计算剩下的涨幅,相比之下,sql的写法则很难扩展,同时窗口函数还要求必须把所有跨行计算全部算完后才能过滤。