【摘要】
SQL 虽然可以对集合中的记录进行循环计算, 但在循环计算过程中利用中间变量、同时计算多个值、前后记录访问、减少循环次数等方面差强人意。而集算器 SPL 则要直观许多,可以按自然思维习惯写出运算。这里对 SQL 和集算器 SPL 在循环计算方面进行了对比,如果需要了解更多,请前往乾学院:SQL 难点解决:循环计算!
1、 求 20 以内的质数
MySQL8:
with recursive t(n) as (
select 1
union all select n+1 from t where n<20)
select n from t
where n!=1 and n not in (select t1.n*t2.n from t t1 join t t2 on t1.n<=t2.n where t1.n>1 and t2.n between 2 and 20/2 and t1.n*t2.n<=20);
集算器SPL:
A | |
1 | =to(20) |
2 | =to(2,20/2) |
3 | =A2.(A1.step(~,~*2)) |
4 | =A1.to(2,)\A3.conj() |
A3: 针对A2中每一个成员,求出它在20以内的n倍数(n>1),并将所有计算结果组成序列返回
A4: 除去1和所有20以内的合数即为20以内的素数,其中A3.conj()求出20以内的合数
2、 求格力电器 (000651) 最长上涨天数
MySQL8:
with recursive t1 as (select *,row_number() over(order by tdate) rn from stktrade where sid='000651'),
t2 as (select *,0 rise from t1 where rn=1
union all
select t1.*, if(t1.close>t2.close,t2.rise+1,0) from t1 join t2 on t1.rn=t2.rn+1)
select max(rise) from t2;
集算器SPL:
A | |
1 | =connect("mysql") |
2 | =A1.query@x("select * from stktrade where sid='000651'order by tdate") |
3 | =a=0,A2.max(a=if(close>close[-1],a+1,0)) |
A2: 按交易日期升序排序
A3: 循环计算 a,若收盘价比上一交易日收盘价高则加 1,否则重新置为 0,然后求每条记录算出来的 a 的最大值