sql解题手 · 集算器敏捷计算-九游会登陆

经常做这种查询?

  • 哪些股票在这个月内连续上涨过五天?
  • 每个地区的收入中位数是多少?
  • 业绩最好的那三个月的增长额有多少?
  • 每门功课都在前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()) /将上级字段中所有的上级名称拼在一起,用逗号分隔。

资源链接


网站地图