经常做这种查询?

  • 哪些股票在这个月内连续上涨过五天?
  • 每个地区的收入中位数是多少?
  • 业绩最好的那三个月的增长额有多少?
  • 每门功课都在前10名的学生?
  • 各个销售员到几月份的销售额就到50万了?

被这些问题困扰?

  • 动不动几十上百行的SQL,嵌套几层看着晕,过几天自己也不懂了
  • 问题要好几步才能算出来,可这数据库不能写存储过程
  • SQL调试费劲,没法单步跟踪,只能打印出临时结果看,效率太低
  • 窗口函数、EXISTS太绕,貌似好用,计算结果却与期望不同

为什么SQL并不适合编写复杂查询?

数据无序

  • 有序运算实现困难,要人为生成序号,烧脑难懂

集合化不彻底

  • 没有显式集合类型,无法保持集合数据,分组时强迫聚合。

关联定义简单

  • 用JOIN实现关联运算,涉及数据表多时显得非常混乱,容易出错

不提倡分步

  • 不直接支持分步计算,而存储过程在很多场景不能使用

使用集算器实现自由计算

用统一语法快速、自由地实现临时计算
桌面级工具,即装即用,环境配置简单!

敏捷语法体系

某支股票最长连续涨了多少交易日

SQL

1 SELECT max(连续日数)-1 FROM
2 (SELECT count(*) 连续日数 FROM
3 (SELECT SUM(涨跌标志) OVER ( ORDER BY 交易日) 不涨日数 FROM
4 ( SELECT 交易日,
5 CASE WHEN 收盘价>LAG(收盘价) OVER( ORDER BY 交易日 THEN 0 ELSE 1 END 涨跌标志
6 FROM 股票 ))
7 GROUP BY 不涨日数)

SPL

A
1 =orcl.query("select * from 股票 order by 交易日")
2 =A1.group@i(收盘价<收盘价[-1]).max(~.len())

便利开发环境

即装即用,调试功能完善

面向过程计算

完整的循环分支控制

示例

计算每月销售额的移动平均值(前后各一个月)

  A
1 =销售表.sort(月份)
2 =A1.derive(销售额{-1,1}.avg()):移动平均)

找出连续上涨三天的股票

  A
1 =股票.sort(交易日)
2 =A1.group(代码)
3 =A2.select((a=0,~.pselect(a=if(收盘价>收盘价[-1],a+1,0):3))>0)
4 =A3.(代码)
算法
对某公司组织结构表,查询指定公司的下属机构,并列出其上级机构名称,多层的用逗号分隔。
文件
ID ORG_NAME PARENT_ID
1 Head Office 0
2 Beijing Branch Office 1
3 Shanghai Branch Office 1
4 Chengdu Branch Office 1
5 Beijing R&D Center 2
...... ...... ......
代码
  A B
1 =connect("db") /连接数据库
2 =A1.query("select * from Organization") /查询组织结构表
3 >A2.switch(PARENT_ID,A2:ID) /将PARENT_ID外键映射到该ID所在的记录,实现自连接。
4 =A2.select@1(ORG_NAME=="Beijing Branch Office") /选出北京分公司所在记录
5 =A2.new(ID,ORG_NAME,~.prior(PARENT_ID,A4) :PARENT) /创建由序号、部门名称和上级组成的新表。其中上级是通过prior函数递归查找北京分公司以下的记录得出。
6 =A5.select(PARENT!=null) /选出上级存在的成员,不存在的说明不在北京分公司下属。
7 =A6.run(PARENT=PARENT.(PARENT_ID.ORG_NAME).concat@c()) /将上级字段中所有的上级名称拼在一起,用逗号分隔。

资源链接


英文版