SQL 难点解决:循环计算

本文对比了SQL和集算器SPL在处理循环计算任务时的不同方法,通过实例展示了SQL在循环计算质数、最长上涨天数、跌幅计算等场景的复杂性,而集算器SPL则表现出更直观简洁的运算方式。对于需要循环计算的场景,集算器SPL提供了解决问题的新思路。
摘要由CSDN通过智能技术生成

【摘要】

        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 的最大值

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值