0

0

集算器如何优化SQL计算(1)动态列_MySQL

php中文网

php中文网

发布时间:2016-05-27 19:11:38

|

1199人浏览过

|

来源于php中文网

原创

结构化计算是SQL的设计目标,常规的聚合、分组、连接等结构化计算用SQL实现没有问题。SQL的计算体系是完备的,但就方便性而言,SQL对复杂运算的考虑仍有不足。具体来讲主要表现为集合化不够彻底、对离散数据和有序运算支持不足、没有对象引用机制、动态性不充分等,造成许多计算的理解和编写都很困难。而集算器在这些方面都有所改进,可以协助SQL更自然地实现复杂计算。

 

当然,集算器并不能也不打算完全替代SQL。对于SQL易于描述的运算,在数据库厂商多年努力下,已经几乎做到极致,集算器不可能也没必要超越。这里列举的都是SQL体系下难以实施或实施得很繁琐的运算,配合集算器实现可以起到事半功倍的效果。

 

这类SQL困难的运算非常杂乱,难以系统地分类罗列,这里只挑选若干较有代表性的例子呈现。

 

动态列

 

SQL认为数据列是数据的属性,应当是静态的,因而没有提供针对列上的集合运算。这样在我们事先不知道列的信息或列很多需要通用方式处理时就会显得很麻烦。

 

列间统计

 

体育测验表结构为:姓名、短跑、长跑、跳远、铅球、…;成绩等级分为优秀、良好、及格、不及格四档,现在要统计各等级在所有项目上的人数合计。

 

思路很简单,把各项目成绩合并起来再分组汇总即可。SQL要用大长串的union合并各项目,写起来很繁琐。而且列数不确定时还要从数据库中动态获取列名拼接,更为复杂。

 

集算器支持列上的集合运算,全动态写法轻松简单:

       

A

 

1

=db.query("select * from 测验表")

 

2

=A1.conj(~.array().to(2,))

从第2字段的各项目成绩合并起来

3

=A2.groups(~:等级;count(1):数量)

分组汇总

对于简单的静态转置,某些数据库提供了pivot和unpivot语句实现,不支持这些语句的数据库也可以用较繁琐的条件表达式和union语句写出来。但转置结果的列由行变换而来,经常是动态的,这时就需要用SQL先算出目标列和行,然后动态拼出另一句SQL来执行,SQL实施这种运算即繁琐又难理解。

A1.art
A1.art

一个创新的AI艺术应用平台,旨在简化和普及艺术创作

下载

 

转置经常是为了呈现,只是行转列也可以不做处理,由报表工具完成。但相当多报表工具的行列并不对称,无法在呈现阶段实现列转行。

 

学生成绩表结构为学生、学期、数学、语文、科学、体育、艺术、…,需要双向转置为学生、科目、学期一、学期二、…。集算器脚本为:

       

A

B

C

1

=db.query("select * from 成绩表 order by 学生,学期")

2

=create(学生,科目,${A1.id(学期).string()})

3

for A1.group(学生)

for 3,A1.fno()

=A3.field(B3)

4

 

 

>A2.record(A1.学生|A2.fname(B3)|C3)

5

return A2

 

 

A2中先用宏生成目标结果集,再在A3-C4的循环中将数据变换后插入到结果集,这是集算器实现转换任务的标准流程,采用分步运算使代码更清晰易懂。这个方案也可用于静态或单向转置,代码会更简单。集算器的列访问机制和动态语言的灵活性,使得各种转置,静态或动态、行转列还是列转行甚至双向同时,都可以采用一致的方案实现。

 

转置计算

 

设有帐户状态变化表T:

序号

帐户

状态

日期

1

A

透支

2014-1-4

2

A

正常

2014-1-8

3

A

挂失

2014-3-21

 

 

 

需要输出指定月份帐户每日的状态,若当日无记录,则延用前一日的状态:

帐户

1

2

3

4

5

6

7

8

9

31

A

 

 

 

透支

透支

透支

透支

正常

正常

正常

...

 

 

 

 

 

 

 

 

 

 

 

严格地说,这是个静态转置,但列数较多且有规律,完全静态写出很麻烦。而且转置过程中还涉及到列间计算,即使有pivot语句用SQL也难以写出。

 

而采用集算器则仍然按上述的流程即可简单实现:

       

A

B

1

=db.query("select * from T where year(日期)=? and month(日期)=?",2014,1)

2

=create(帐号,${to(31).string()})

3

for A1.group(帐号)

=31.(null)

4

 

>A3.run(B3(day(日期))=状态)

5

 

>B3.run(~=ifn(~,~[-1])

6

 

>A2.record(A3.帐号|B3)

7

return A2

 

这里只涉及单向转置,比上例少一层循环,B3-B5中按规则计算插入数据的过程稍复杂些,但整体过程并无不同。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

2

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

76

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

73

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

67

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

19

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Node.js 教程
Node.js 教程

共57课时 | 9.9万人学习

Vue 教程
Vue 教程

共42课时 | 7.5万人学习

Go 教程
Go 教程

共32课时 | 4.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号