SQL 如何查询连续上涨 N 次的记录

用SQL如何查询连续上涨N次的记录?

这个问题用SQL来做很难!

SQL的理论基础是无序集合,早期SQL也没有次序的概念,需要用JOIN造出次序,连续上涨这种问题就非常困难。后来在SQL2003标准中加入了窗口函数,一定程度地缓解了这个问题,但解决连续上涨问题仍然并不轻松。

举个例子:查询连续n天上涨的股票,现有数据库表stock数据如下:

codestockdateclose
0000622015-01-058.91
0000622015-01-068.31
0000622015-01-077.6
0000622015-01-087.93
0000622015-01-097.72

如果查询连续3天上涨的股票,用SQL写出来是这样:

WITH A AS

       (SELECT CODE,STOCKDATE,(CLOSE-LAG(CLOSE) OVER (PARTITION BY CODE ORDER BY STOCKDATE) )CLOSE_UP FROM STOCK),

B AS

       (SELECT CODE,

              CASE WHEN CLOSE_UP>0 AND

                     LAG(CLOSE_UP) OVER (PARTITION BY CODE ORDER BY STOCKDATE)>0 AND

                     LAG(CLOSE_UP,2) OVER (PARTITION BY CODE ORDER BY STOCKDATE)>0

                     THEN 1 ELSE 0 END UPDAYS3 FROM A)

SELECT DISTINCT CODE FROM B WHERE UPDAYS3=1

这里把3天写死进去了,要查询连续5天就会更复杂, n天就不知道怎么写。

 

对于这种有序的运算,如果使用集算器的SPL语言就会简单很多,只需2行代码:

 A
1=connect("mydb").query("select   * from stock order by code, stockdate").group@o(code)
2=A1.select((a=0,~.pselect((a=if(close>close[-1],a+1,0))>=5))>0).(code)

如果要查询n天,只要把A2中的5改成n即可。

 

SPL基于有序集合实现,对有序计算的支持比较彻底,能清楚表述集合中任意位置的记录,通过绝对/相对位置定位,很容易计算股票每日涨跌。

有序集合除了定位计算,还有非常规迭代聚合、有序循环、有序排名等多种计算手段,参考c.raqsoft.com.cn/article/1557384887803c.raqsoft.com.cn/article/1557819034958,这些技术对简化计算编程很有帮助。

集算器 SPL 是解决 SQL 难题的专业脚本语言,它语法简单,符合自然思维,是天然分步、层次清晰的面向过程计算语言。它采用与数据库无关的统一语法,编写的算法可在数据库间无缝迁移。它是桌面级计算工具,即装即用,配置简单,调试功能完善,可设置断点、单步执行,每步执行结果都可查看。请参阅SQL 解题手

SPL也能很方便地嵌入到JAVA应用,可参考《Java 如何调用 SPL 脚本》

具体使用方法可参考 《如何使用集算器》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值