[摘要]
虽然SQL可以对一个集合中的记录进行循环计算,但是使用中间变量,同时计算多个值,前后访问记录,减少循环次数,并不能令人满意。积分器SPL更加直观,可以按照自然的思维习惯写操作。这里就循环计算来比较SQL和积分器SPL。如需了解更多,请到干部学院:SQL疑难解答:循环计算!(http://c.raqsoft.com.cn/article/1546870228191?r =微笑天使)
1.求20以内的素数
MySQL8:
递归t(n)为(
选择1
union all从t中选择n+1,其中n & lt20)
从t中选择n
哪里n!=1且n不在(从t t1选择t1.n*t2.n,在t1上连接t t2,& lt=t2.n,其中t1 . n > t。1和t2.n介于2和20/2和t1 . n * T2 . n & lt;=20);
SPL集成商:
A3:对于A2中的每个成员,在20 (n >: 1)内找到其N倍,并按顺序返回所有计算结果
A4:排除1和所有20以内的复合数是20以内的素数,其中A3.conj()求20以内的复合数
2.求格力电器上涨天数最长(000651)
MySQL8:
递归t1 as (select *,row _ number())over(order by tdate)rn from STK trade其中sid='000651 '),
t2 as(选择*,0从t1上升,其中rn=1
联合所有
选择t1。*,if(t1 . close & gt;t2.close,t2.rise+1,0)从t1加入t1上的t2,rn=t2.rn+1)
从t2中选择最大值(上升);
SPL集成商:
A2:按交易日期升序排序
A3:循环计算A。如果收盘价高于前一个交易日的收盘价,加1,否则重置为0,然后求出每条记录计算出的A的最大值
3.求信息发展(300469)历史最高收盘价2018年2月14日下跌
MySQL8:
选择1-t2.close/t1.close瀑布
from(选择max(close) close from stktrade,其中sid='300469') t1,
(从stktrade中选择close,其中sid='300469 '且tdate = ' 2018-02-14 ')T2;
SPL集成商:
4.求信息发展(300469)2018年1月1日至10日累计日交易量
MySQL8:
选择tdate,volume,sum(volume)over(order by tdate)cum
来自stktrade
其中sid='300469 '和t日期介于' 2018-01-01 '和' 2018-01-10 '之间;
SPL集成商:
A3:对于A2中的每条记录,将卷列重新分配给前一条记录的累计列和该记录的卷列之和,最后返回A2
A3: A.iterate(x,a,c)相当于变量~ ~的初始赋值给a,然后循环a中的成员,每次将x的计算结果赋值给~ ~,然后判断c是否为真,如果是,继续循环,否则返回~ ~。@表示本地空间值,此处用作中间变量。
6.当不重复计算重叠部分时,计算多个时间段中包含的总天数
MySQL8:
tt(开始,结束)为(选择日期' 2010-01-07 ',日期' 2010-01-9 '
联合所有选择日期' 2010-01-15 ',日期' 2010-01-16 '
联合所有选择日期' 2010-01-07 ',日期' 2010-01-12 '
union all select date'2010-01-08 ',date'2010-01-11 '),
测试方式(从tt订单开始选择*),
tmp as(
选择t.start,t.end,@ m:= if(@ m & gt;@p,@m,@p) m,@p:=end,
@m >时的情况;当@ m & ltstart然后datediff(end,start)+1 else datediff(end,@m)结束天数
从t中,选择@m:=date'1970-01-01 ',@p:=@m) s
)
从tmp中选择sum(天数);
注意:@m是此记录的前一个结束日期的最大值,@p是此记录的结束日期,days是自前一个最大结束日期以来经过的天数。这个问题的其他解决方案可以参考《SQL难度解析:集合和行号》(http://c.raqsoft.com.cn/article/1542508403539)和《SQL难度解析:记录的引用》(http://c . raqsoft . com . cn/article/1544663642094)中相同的例子。
SPL集成商:
7.列出2018年6月11日至15日信息发展(300469)和招商银行(600036)的交易信息和累计成交率
MySQL8:
k as(选择sid、循环、tdate开始、lead(tdate,1,date_add(now()、interval 1 day))结束(按sid顺序分区,按tdate)结束
来自股票)
选择t.*,circ,sum(t . volume/k . circulation/10000)over(按sid顺序分区,按tdate)速率
从stktrade t join k on t.sid=k.sid和t.tdate & gt=k.start和t.tdate & ltk .结束
其中t.sid在(' 300469 ',' 600036 ')和t.tdate之间' 2018-06-11 '和' 2018-06-15 ';
SPL集成商:
1.《300469 SQL 难点解决:循环计算》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《300469 SQL 难点解决:循环计算》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/jiaoyu/1055353.html