- 博客(170)
- 收藏
- 关注
原创 SQL 像英语是个善意的错误
在 SQL 中的对应表现就是在一条语句中配有多个动作,SELECT、WHERE、GROUP 这些本来是无关的动作,在其它程序语言中通常会设计成多个函数,但在 SQL 中都会设计成语句的子句。而 SQL 不同,它会把整个句子写成符合英语习惯的形式,还会补充很多不必要的介词,比如 FROM 作为语句的运算主体却被写到后面,GROUP 后面要写一个多余的 BY。关于过程性,业界有个说法,SQL 是声明式语言,用户只要关心要什么,而不必关心怎么做,数据库会自动找解决方案,这档的语言不需要支持过程性。
2024-11-01 17:01:36 685 1
原创 索引的本质是排序
一个 N 行的数据表,遍历查找则需要比较 N 次,而如果数据按该字段值(在索引中称为键值)有序,那么就可以用二分法查找,只要比较 logN 次(以 2 为底),比如 10 亿行数据只要比较 30 次(10 亿约是 2^30),这显然能大大提高性能。如果建立 A,B 双字段索引,对 A,B 有序当然对 A 也有序,这样 A=1 就可以利用这个索引,同时 A=1 AND B=2 也能用到,这就会让索引的应用范围更广一点。但是,这种索引对单独的 B=2 却无效,因为对 A,B 有序时对 B 则无序。
2024-11-01 16:56:46 376
原创 为 Lambda 语法增加序运算能力
考虑到有序性时,Lambda 语法的规则就比常规集合运算要复杂一些,而这些有序运算是经常发生的,如果 Lambda 语法不支持,会导致这些计算难以描述,程序员就要再退回到编写多行循环语句的状态,或者人为造出序号,繁琐且影响可读性。SQL 没有提供有序的 Lambda 语法,经常需要使用子查询和窗口函数来生成序号,某些复杂些的有序遍历运算甚至写不出来,也要用存储过程手段转换成多行循环语句才可以。除了相邻成员外,还可能有相邻集合的引用,比如还是上面的集合,我们希望计算前后各一个月的销售额移动平均值。
2024-10-31 17:13:01 677
原创 从集合运算设计 Lambda 语法
我们在讲集合化特性时还提到,面向结构化数据的 Lambda 语法要有简洁方式引用字段,SQL 就提供了可以直接引用字段的便捷机制,而 SQL 又只能计算字段,那就可以不必再提供引用当前成员(记录)的手段了。也可以分两步做,先计算出集合成员的平方构成一个新集合,再计算新集合的合计,写成 A.(~*~).sum() 的形式。这是最简单的情况,采用普通的函数语法风格就可以,将待计算的集合作为参数传入,比如 sum(A) 用于计算集合 A 成员的合计,当然也可以使用对象式的语法风格写成 A.sum()。
2024-10-29 16:13:58 653
原创 Java,统计大 csv 文件中每组的数量
函数T用于解析csv文件,@c表示大文件游标模式。函数groups用于分组汇总。大 csv 文件 data.csv 超出内存,第 3 列是分组列。要求:用 Java 对第 3 列分组,统计每组记录数。Java 集成 SPL 可参考。
2024-10-29 16:00:26 306
原创 文件的性能分析
整数还是最简单的数据类型,如果是实数还要处理小数点,字符串解析时要考虑转义字符和引号匹配,日期的解析更是要麻烦得多,因为格式种类太多,2024/1/10 和 10-1-2024 都是常见的合法日期格式,甚至还有 Jan-10 2024 这种,要正确解析,就得尝试用多种格式去匹配,CPU 耗时很严重。合理的做法是根据数的大小决定位长,比如小整数只存储一个字节或两个字节,大整数才存储更多的字节,因为小整数较常见,结果会使得总体存储空间降低,从而获得性能优势。但是,文本的性能却非常差!
2024-10-23 15:58:10 384
原创 多数据源的混合计算就该这样玩
这样,不需要事先定义元数据做映射,直接使用数据源本身提供的方法来访问数据,然后封装成这两种数据对象之一即可。早期应用通常只会连接一个数据库,计算也都由数据库完成,基本不存在多数据源混合计算的问题。这时候通常会把一部分历史数据移到专业的 AP 数据库中,也就是冷热分离,TP 数据库只保存近期产生的热数据,AP 数据库保存历史冷数据,TP 数据库压力减轻后即可流畅运行。很简单,esProc 提供了标准的 JDBC 驱动,被 Java 程序引入后,就可以使用 SPL 语句了,和调用数据库 SQL 一样。
2024-10-22 14:40:29 713
原创 Java, 将 csv 中空值用上一行的值填充
要求:用 Java 修改文件,当 Number 为空时,用上一行的值填充本行,结果存为新 csv。函数T用于读取或写入csv文件,~ 表示当前记录,~[-1]表示上一条记录。csv 文件的 Number 列有时为空。Java 集成 SPL 可参考。
2024-10-22 14:13:19 228
原创 数据库有成千上万的表是怎么回事?
但关系数据库不支持这种方案(它的模式概念可理解为只能分两层),这就要给表起较长的名字来分类,这一方面使用不便,另一方面对开发管理水平要求很高,在工作较急迫时就顾不上规范了,上线了也就忘了,A 业务搞几十个,B 业务弄几十个,时间一长,就会遗留大量的中间表。有了 esProc SPL 开放且可集成的计算能力,在设计应用的体系结构时就会更为得心应手,计算可以放在最合适的位置,不必为了获得计算能力而部署多余的数据库,让数据库专心做它最合适的事,复杂的灵活的计算都丢给 SPL 解决,将资源效用发挥到最大。
2024-10-17 17:11:27 894
原创 BI 的前置计算
关键的是,集算器提供了开放的计算能力,程序员可以拿到 SQL 语句后用 SPL 分拆其中 WHERE 子句中的时间段参数,识别出该查询涉及的数据范围是哪些。如果还涉及更远期的历史数据,则仍将查询发给中央数据仓库完成计算,过程还可以用 SPL 将 SQL 语句翻译成数据仓库接受的语法,完美地实现了可编程的数据网关功能。对于交互性很强的多维分析业务来讲,这是很难容忍的。扩容是不现实的,这已经是个分布式系统了,节点数也差不多到了 MPP 型数据仓库的极限,再增加节点并不会有明显的性能提升了。
2024-10-16 15:33:31 1027
原创 Excel筛选数据时用到分类汇总值
先算出组平均值赋给临时变量 a,再用 ProductSales>a 作为过滤条件对组进行过滤。运用SPL插件处理Excel疑难杂症会容易很多。
2024-10-16 15:30:07 431
原创 分组汇总后按指定序列对齐
要求:对temp_data按照年份和LETTER分组,对记录数计数,再按照年份、LETTER的叉乘对齐,对不上则为null。叉乘时年份按时间顺序排列,LETTER按LETTER_SEQ的顺序排列。temp_data表的LETTER字段是外键,指向temp_ref表的LETTER字段。temp_ref表的LETTER_SEQ规定了LETTER的顺序。A1、A2:执行简单SQL,对temp_data分组汇总;A3:先叉乘,再外键式关联 A1。Oracle数据的temp_data表如下。
2024-10-16 15:21:30 319
原创 硬盘的性能特征
如果要数据在硬盘上是连续存储的,那取 100 万次 100 字节也不会很慢,因为后面要读的数据已经在前面读出的数据块里面而不必再读,硬盘和操作系统都有缓存功能,实际硬盘读取次数并没有那么多,性能下降了不会非常严重。所以还要在 "频繁小量" 前面加上“随机”这个定语,也就是读取的内容不连续,这时候,从读出数据块中取出需要的部分外,其它内容没有用,只能浪费掉,后面再用又要重新读,性能就会陡降了。固态硬盘的情况要好很多,它没有寻道时间了,不过频繁的随机小量读取仍然不行,硬盘的数据块实在太大了。
2024-10-14 13:59:33 627
原创 按分类汇总值筛选
有如下日产品销售额的 Excel 表格:找出日销售总额超过 30 万的日期有哪些:用SPL插件在Excel中输入:=spl("=E(?
2024-10-14 13:52:47 195
原创 SQL,给连续的行加上标识序号
A1:SQL取数,按source_id,event_date排序,其中SERIES_ID 为空。A2:不排序,按source_id相邻的值分组,组内按 event_user 相邻的值再分小组。现在要增加计算列SERIES_ID,在source_id内按顺序给每个有序小组加序号。A3:在大组内给每个小组赋予序号,合并各组到记录级。
2024-10-14 13:48:13 270
原创 BI 软件能对付多少数据分析任务?
不过,实现关联查询并不容易,其根源是关系数据库对关联运算(JOIN)的定义过于简单造成的,导致数据集之间的关联关系看起来过于繁琐,超出许多业务人员的理解能力。经常的情况是:BI 厂商说的是多维分析,而用户想的是那些需要过程计算才能解决的问题,这个错位就会导致期望高而失望大的局面。从早期喊的多维分析到近年来喊敏捷 BI,BI 厂商一直在强调自助能力,宣称可以由业务人员自己随心所欲地分析数据,而用户也常常有强烈的需求,双方一拍即合,很容易形成购买行为。数据分析的根本在于数据,或者说是在于计算,而不是界面。
2024-10-12 14:33:17 349
原创 SQL, 有终止条件的多次累计计算
MSSQL数据库的data表存储了多人上电梯的情况,turn表示进电梯的顺序。电梯最大承重1000公斤,每趟能上的人数有限,超重的人要等下一趟。A3:按每趟电梯分组。当累计值大于 1000 时,开始新的分组,并将累计值重置为当前乘客体重。A4:取每组的最后一条记录的 name 字段。请计算每趟电梯最后一个进入的人的名字的列表。A1:用SQL取数,按turn排序。A2:给累计变量设初值。
2024-10-11 10:08:48 204
原创 SQL,解析 json
现在要解析json,取出values.values所有的值,即:value1,value2。A2:解析多层json,取出所有的values.value。A1:执行简单SQL,取出json串。
2024-10-09 10:50:49 452
原创 Excel中多条件筛选问题解决方法
例题解析:有雇员信息表如下所示:查询出 Gender 为 Female,且 1970 年以前出生的员工:=spl("=E(?
2024-10-09 10:46:06 200
原创 查询计算移出数据库用 Java 太慢咋办
理论上是这样的,但还是上述原因,Java 本身没有通行的存储机制,如果不用数据库,那一般只能用 CSV/TXT 之类的公共格式,这种格式的性能和数据库区别并不大,还存在丢失数据类型信息的风险。那么,能不能不用数据库存储以获得更高的读取性能呢,毕竟大部分数据都是不再改变的历史数据,还在改变的数据量通常比较小,如果换一种高效访问方案来存储冷数据,就只有小量热数据需要临时读取,Java 的运算性能是不是就能大幅提升?在许多复杂场景,SPL 实际跑出来的性能会远高于数据库的 SQL,经常能做到单机跑过集群的效果。
2024-10-08 14:22:09 2090
原创 SQL,连结多行的字串并去除重复
MSSQL库data表存储了航班衔接关系,ID字段是航班组,即有衔接关系的一组航班;ROUTE字段是前后衔接关系,由前后两个航班组成,用短横连接;LNO字段是衔接顺序。A2:按ID分组,处理每组数据~。先将组内的ROUTE字段按-拆分,再一起合并,对前后重复的航班进行去除重复(不排序去重),最后用-连接。现在要算出每组航班的完整的衔接序列,并按航班组排序,仍然用短横连接。A1:执行简单SQL,注意排序。
2024-10-08 14:10:00 313
原创 BI 和 AI 有什么区别?
但目前的技术还很难做到,企业应用的数据结构常常很复杂,不太可能简单地放到 GPT 的 prompt 里面(远远超过它的长度),而再做 fine-tune 的成本也比较高,关键是缺少素材。现代狭义 BI 的目标是让业务人员能分析数据,采用的方法是流畅的可视化界面,如果利用生成式 AI 技术,能够让机器直接将人类的语言文字转换成数据的计算,这样就可以进一步降低应用门槛了。BI 是目的,AI 是手段,BI 可以用 AI 的手段实现,也可以用其它手段实现,从这个意义上讲,BI 的 I 将大于 AI 的 I。
2024-09-30 16:17:46 1006
原创 SQL,将多对多的关联记录按行输出
要求从两张表中找出符合条件W=100,H=500,D=300的记录,先输出Primay里的一行,再输出相关联的Secondary的每一行。A3:A2为空时返回空,A2不为空时,循环A1的每条记录 ~,合并 ~ 和 A2,最后再合并循环的结果。数据库的Primary表和Secondary表有相同的结构,其中W、H、D是主键。A1、A2:执行简单SQL,条件查询。
2024-09-30 15:58:30 477 1
原创 再来谈离散性,Java 比 SQL 又有什么优势?
SQL 中记录必须依附于表,不能独立存在,也就是成员必须依附于集合,拆解集合成员的操作是没有意义的,因为拆出来也没有对应的数据类型来承载。,指出 SQL 有集合化不彻底、缺乏有序支持等问题,这些问题,以及 SQL 还有的其它问题,都有一个共同的根源,这导致虽然 SQL 的繁琐度低于 Java,但难度却更大。,有序计算是典型的离散和集合的结合物,成员的次序在集合中才有意义,这要求集合,有序计算时又要将每个成员与相邻成员区分开,会强调离散。没有集合的集合,SQL 在分组时无法保持分组子集,必须强迫聚合,
2024-09-29 14:02:44 841
原创 Excel中查找某个值的位置,用位置取值
有 2022 年 1 月的日销售额统计表如下所示:找出销售额最大的是哪一天,在 C2 单元格里输入:=spl("=E(?返回结果 12接着找出销售额最大的那天的前 5 天和后 5 天的销售额:=spl("=E(?1).to(?2-5,?
2024-09-29 13:58:30 526
原创 SQL,获取 ID 的历史状态
A2:按 Id 分组,根据分组新建二维表。~ 表示当前组,Visit_code[-1] 表示上一条记录的 Visit_code 字段,interval@m 用于求月份的间隔。要求计算出每个病人的历史状态,如果有过咨询,则 Office_Visit=1,否则为 0;A1:通过JDBC从 sas 表取数,按Visit_code,Visit_Date 的顺序排序。
2024-09-29 13:52:07 242
原创 从 SQL 和 Java 的对比理解集合化,SQL 到底比 Java 优势在哪?
还有种办法是定义一个复杂的类能够用来描述动态的结构,字段名和值都作为数组成员,然而这已经不是 Java 风格的类了,成员的引用都不能简单地用 dot,而要调用函数,很不方便。Java 的 Lambda 语法并不天然知道认得记录,对它来讲就是个参数,取记录的字段(也就是类的成员)要用 dot 操作符,如果表示当前成员的参数名为 it,就要写成 it.price*it.quantity 这种啰嗦的形式。结构化数据计算中,计算结果经常也是有结构的数据,它的结构和运算相关,没办法在代码编写之前就先准备好。
2024-09-25 17:13:04 1552
原创 把大 csv 拆成若干小文件
要求:用 Java 将该文件拆分成 5M 左右的小文件,文件名带序号,比如 Orders1.csv、Orders2.csv……注意一条记录不要分到 2 个文件。A3:从1到N循环:将大文件按体积大致分为N份,每次取第i份,写入新文件,自动保证记录完整。A2:算出小文件数量N。符号\是除法取整,+1后每个文件略小于5M。Java 集成 SPL 可参考。
2024-09-25 17:07:28 210
原创 如何在Excel中快速找出前 N 名,后 N 名
有如下销售额统计表:找出销售额排前 10 名的产品及其销售额,和销售额排倒数 10 名以内的产品及其销售额,结果如下所示:前 10 名:=spl("=E(?后 10 名:=spl("=E(?
2024-09-25 17:02:49 460
原创 读取 csv 的指定列
要求用 Java 实现:以指定的多个列号为参数,从 csv 文件中取出多列,解析为二维表。函数T解析或写入文件,可指定多个列号。${}将字符串当表达式执行。有个格式规范的 csv 文件。
2024-09-24 17:00:39 211
原创 找第 n 个,找倒数第 n 个
有如下销售额统计表:找出销售额排第 10 名的产品及其销售额,和销售额排倒数第 10 名的产品及其销售额,结果如下所示:解决方式;用SPL插件,在Excel中一行代码搞定,具体如下:第 10 名:=spl("=E(?倒数第 10 名:=spl("=E(?
2024-09-24 16:54:10 294
原创 在全表查找字符串
要求查找每个表格的每个单元格,只要匹配指定的字符串比如foo,就列出该行完整数据。Excel有两个sheet,sheet里有结构相同的表格。符号 | 用于合并两个序列。
2024-09-13 17:39:31 294
原创 SQL,在组内根据相邻行修改取值 null 的列
要求:对 company 相同的记录,从前往后处理每组数据,首先删除记录直到遇到第一个 column3 非 NULL 的记录;再把后续等于 NULL 的 column3 改为前面非 NULL 的值,直到遇到下一个非 NULL 的值,然后继续本过程。A2:处理每条记录:同组记录时,如果本行的 column3 非 null 则不修改,为 null 则改为上一条。A3:再选出 column3 非 null 的记录,按 date 排序,返回结果。Java 集成 SPL 可参考。
2024-09-13 17:37:09 366
原创 我们需要怎样的 OLAP
近年来流行的敏捷 BI 产品在操作的流畅性和界面的炫丽度都较早期 OLAP 产品有较大的提升,但本质计算功能并没有增长多少,还是在做多维分析,该不能算的还是不能算。业内可能只有 esProc SPL 才是适合 Excel 分析师使用的程序语言了,SPL 有强大的结构化数据处理能力,特别地,SPL 还提供了 Excel 插件,允许用户在 Excel 中直接使用 SPL 代码完成 Excel 很难实现的复杂运算。SPL 功能强大,代码开发效率高,还适合大数据,脚本化的代码也很容易入库管理和再次利用。
2024-09-12 15:54:26 1108
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人