- 博客(1043)
- 收藏
- 关注
原创 分组后合并记录中的字段值
如果想给输出的每行加上 repositoryCommitters,只需要将 A2 改为。集算器提供了 JDBC 接口,可以像数据库一样使用,
2022-11-24 09:53:03 398
原创 解析字符串后分组写成多文件
用正则表达式解析字符串很慢,而且每次只写一条记录,这也很慢,应该批量写。这里用集算器实现上面的计算过程很简单,只需几秒搞定。集算器提供 JDBC 接口,可以像数据库一样使用,
2022-11-23 10:14:45 156
原创 对 CSV 分组后将成员合并成字符串
这里需要进行简单的结构化计算:按照第 1、2、3 列分组,再将组内的第 4 列用逗号拼在一起。但 JAVA 缺乏相关的类库,实现过程复杂,代码可读性差。A2: 按前 3 列分组,再将每组 (即 ~) 的第 4 列用逗号拼在一起。集算器提供 JDBC 接口,可以像数据库一样使用,A1: 用分隔符 "|" 读取文件。
2022-11-22 10:36:50 200
原创 分组后将成员拼成字符串
集算器提供 JDBC 接口,可以像数据库一样嵌入到应用程序中,用起来很简单,可参考。A2:按 _1 分组,并且将分组后的 _2 和 _3 字段用逗号分隔合并。
2022-11-21 09:30:50 334
原创 多层固定分组计算
需求是将入库出库的数量进行计算,获取每个操作日期,每个商品的起始数量、入库数量、入库后的数量、消费数量和结束数量。用 SQL 实现此算法要使用嵌套查询或结构复杂的 join 语句,再加上涉及分组汇总和行间计算,又要用到窗口函数,这就使代码更加难写。为序表增加需求的几个列,同时计算其值。A3:A2 按照品名分组,group 函数可以做到只分组,不聚合,这一点也优于 sql,方便了接下来对每条记录逐一计算。这样,我们在每个商品的序表中增加了需求的字段,完成了这些字段值的计算,最终将多个商品的结果合并在一起。
2022-11-18 14:24:35 60
原创 多层固定分组计算
需求是将入库出库的数量进行计算,获取每个操作日期,每个商品的起始数量、入库数量、入库后的数量、消费数量和结束数量。用 SQL 实现此算法要使用嵌套查询或结构复杂的 join 语句,再加上涉及分组汇总和行间计算,又要用到窗口函数,这就使代码更加难写。为序表增加需求的几个列,同时计算其值。A3:A2 按照品名分组,group 函数可以做到只分组,不聚合,这一点也优于 sql,方便了接下来对每条记录逐一计算。这样,我们在每个商品的序表中增加了需求的字段,完成了这些字段值的计算,最终将多个商品的结果合并在一起。
2022-11-18 14:22:51 653
原创 Jasper 中如何将数据拆成多行并跨行累计
A3:创建由LoanID,LoanAmt,payment,Term,Rate,interest,principal,principlebalance组成的新序表,并根据A2每条记录的Term值,将A2的每条记录拆分成Term条新记录插入到创建的新序表中。以A2中L01这条记录为例:Term=5,该条记录被拆分为5条记录插入到新序表中,通过t=t-principal,t被重新赋值,因此这5条记录中,interest,principal,principlebalance列都在逐条变化。
2022-11-17 11:41:14 435
原创 动态拼接 merge 语句
首先针对columns和pks求差列,获取非主键字段组成的序列,再对该序列循环计算,将计算后的序列成员拼成逗号连接的字符串,形如:t.C=s.C,t.D=s.D。对序列pks循环计算,将计算后的序列成员拼成and连接的字符串,形如:t.A=s.A and t.B=s.B。表的主键,每个数据库获取主键方式不同,这里以MSSQL为例。同理拼成形如s.A,s.B,s.C,s.D的字符串。中,形如["A","B","C","D"]A2:将主键组成的序列保存到变量。中,形如["A","B"]
2022-11-16 11:04:39 182
原创 动态拼接 merge 语句
首先针对columns和pks求差列,获取非主键字段组成的序列,再对该序列循环计算,将计算后的序列成员拼成逗号连接的字符串,形如:t.C=s.C,t.D=s.D。对序列pks循环计算,将计算后的序列成员拼成and连接的字符串,形如:t.A=s.A and t.B=s.B。表的主键,每个数据库获取主键方式不同,这里以MSSQL为例。同理拼成形如s.A,s.B,s.C,s.D的字符串。中,形如["A","B","C","D"]A2:将主键组成的序列保存到变量。中,形如["A","B"]
2022-11-16 11:03:16 405
原创 mysql- 分组后对子集运算
A2:按照t,p1,p2分组统计两个球员在同一球队一起比赛时p1球员比p2球员进球多的场次,和p1球员比p2进球少的场次。A1:sql取数,取得两个球员在同一球队一起比赛的进球数据。这个代码也容易嵌到应用程序中,具体可参考。的记录,即选出进球多的场次更多的球员。
2022-11-15 12:25:32 303
原创 去除有重复的行
只要按前3个字段分组,选出成员计数等于1的组,再合并各组记录即可。A2:按前3个字段分组,选出成员计数等于1的组,再合并各组记录。A3:将A2结果写入文件result.csv中。A1:读取文件source.csv中的内容。有人给出解法但楼主表示看不懂。
2022-11-14 10:24:04 65
原创 去除有重复的行
只要按前3个字段分组,选出成员计数等于1的组,再合并各组记录即可。A2:按前3个字段分组,选出成员计数等于1的组,再合并各组记录。A3:将A2结果写入文件result.csv中。A1:读取文件source.csv中的内容。有人给出解法但楼主表示看不懂。
2022-11-11 17:30:00 449
原创 组内再分组汇总并取前 N 名后合并
上述思路虽然清晰,但用 SQL 却很难表达组内运算,所以你“Stuck on Sql query”。1. 将数据按 User_ID 分成多个组,每个组是一个用户的全部数据。2. 组内运算,将每组数据按日期再分组,并汇总出每日的总分。2.A2 中的的分组不用聚合,所以用 group 函数。3.A3 中的分组需要聚合,所以用 groups 函数。3. 组内运算,在每组数据中求得总分前三名的记录。4. 上述代码和 JAVA 或报表很容易集成,1. 上面的“~”代表的是“每组数据”。4. 将所有数据合并。
2022-11-10 12:33:39 429
原创 取出分组后前 N 名对应记录
这个问题的难点是 max 函数只能计算出最大值 / 最小值,但不能取出“最大值对应的记录”,再加上分组和关联,就会让问题更显复杂。在 ORACLE 中还可以使用 keep/ top/row_number,或者用窗口函数等方法,当然,这些方法都比较麻烦。集算器的 top 函数可以取出最大值对应的记录,比如 salary.top(amount;3) 取出 amount 最小的三条记录,salary.top(-amount;1) 取出 amount 最大的那条记录。继续计算,对每组数据,取出 ID 最小的记录。
2022-11-09 10:45:45 171
原创 分组子集对齐后再做差集
有两个难点要解决:库表按照指定的日期序列分组,而不是库表中的字段;每日注册的 id 如何和每日解答的 userid 进行差集运算。A4、A5:使用函数 align,将集合按指定序列对齐。A3:使用函数 periods,根据参数生成时间序列。有人给出解答,楼主说比较像,但没进一步反馈。A1、A2:通过 SQL 取表中数据。A6:生成新序表,“\”表示差集。
2022-11-08 09:45:11 113
原创 分组的子集比较
A3:创建新序表,其中 Set1 是集合类型的参数,值为 [[“Social”,75,2015],[“Science”,88,2015]],Set2 值为 [[“Social”,75,2015],[“Maths”,50,2014]],函数 pos 可计算集合 A 是否有包含集合 B。直观上就应该用集合运算来解决,但 SQL 没有显式集合,只能拼凑实现,条件发生变化时代码很难改。这种情况建议读出来用 SPL 实现,代码很直观易改。A1:使用 SQL 取表中数据。A2:根据 NAME 进行分组。
2022-11-07 11:46:41 111
原创 分组后再子集再查询
从这里面查询每个产品 (ProductID) 具有某个(或同时具有某几个)属性 (即 AttID) 的产品数量,并按 ClassID 分组。如果查询的产品同时具有多个属性,比如同时具有 AttID 为 1 并且 AttID 为 2 时,上面的 SQL 就会出问题。SELECTclassid,COUNT(ProductID)AS数量。下面是正确的查询结果,请问怎样写 SQL 能得到下面的结果集呢?A2:通过 group 进行分组聚合计算。A1:使用 SQL 取表中数据。
2022-11-04 11:20:56 356
原创 分组后成员作为集合两两运算
把不同 sandwich 的 ingredient 集合两两做交集,计算交集成员数量再排序即可。但 SQL 没有显式集合,代码很难懂。A2: 将 A1 按 sandwich_id 分组。collection 是每种 sandiwich 的 ingredient 集合。A3: 将 sandwich 两两分为一组。比如 0,1,3 可分为三组:[0,1],[0,3],[1,3]A4: 求各组交集的成员数量。A5: 将 A4 的结果集降序排序。关于显式集合请参考【
2022-11-02 09:28:19 124
原创 分组后成员的再分组
A4-B6:循环地点分组,B4 取得每组第一个开始时间,B5 通过当前开始时间与第一个开始时间间隔(10 分钟)将成员分组,最后通过 B6 将分组结果写回到 A2 结果序表中。要求,同一个地点,开始时间间隔超过 10 分钟的,这个地点要在结果中再出现一次,10 分钟之内的假如有多条,统计条数和报警时长,时长 =10 分钟内各条时长之和。现在想统计,各个地点报警次数和时长,时长 = 结束时间 - 开始时间。现在有这么一个需求,一个表中记录了各个地点的报警开始时间,结束时间。A2:创建目标空结果集。
2022-11-01 11:52:05 94
原创 分组后成员的再分组
A4-B6:循环地点分组,B4 取得每组第一个开始时间,B5 通过当前开始时间与第一个开始时间间隔(10 分钟)将成员分组,最后通过 B6 将分组结果写回到 A2 结果序表中。要求,同一个地点,开始时间间隔超过 10 分钟的,这个地点要在结果中再出现一次,10 分钟之内的假如有多条,统计条数和报警时长,时长 =10 分钟内各条时长之和。现在想统计,各个地点报警次数和时长,时长 = 结束时间 - 开始时间。现在有这么一个需求,一个表中记录了各个地点的报警开始时间,结束时间。A2:创建目标空结果集。
2022-11-01 11:51:21 402
原创 引用特定条件下的第一条数据
A2:选出 creattime 为 2015-05-20 且 workid 为 201;或者日期为 2015-05-20 且相同 Tid 下第一条记录 workid 为 201 的记录。要求统计工号 201 报表 2015-05-20 日结果为。所以 2015-05-20 也要出现在 201 的报表里面。1001702调整2015-05-20-100。1001702调整2015-05-20-100。5001201销售2015-05-20500。5001201销售2015-05-20500。
2022-10-31 09:11:17 206
原创 行列均按段分组汇总
这张交叉表的行组和列组都是分段区间,测度来自其他表。思路是先分好分组区间,从两个外键表中聚合出计数值除用户数量,并填入对应的单元格。A4:将 account_detail 表数据查出序表,然后选出满足分组区间最小值的记录,存为对象 account_detail。A7:计算出每个账户存在于的结果表的行列位置。A5:类似 A4 查 paysoft_result 表。A8:根据结果表行列位置分组,计算结果比率。A6:类似 A4 查 NAEDO 表。A1,A2: 规定分组区间。A3:链接 test 库。
2022-10-27 09:59:47 141
原创 分组后组内成员对齐
解决思路是将数据按 pid 分组,将组内的 race_code 按照固定顺序的字符串组 [“abc”,“def”,“lmn”,“pqr”,“xyz”] 对齐,再翻译为 01 编码。他希望将每个人物对应的代码汇总成一串 1 和 0 组成的字符串,当人物有某个代码记录时,汇总字符串对应顺序上的数字是 1,反之是 0。A4:按照 pid 对原始数据分组,并根据原始记录计算出 code 列:与 A3 序列按 race_code 对齐后,非空为 1,空值为 0,并将这个结果拼成字符串。
2022-10-26 10:16:42 195
原创 读入后分组,要快
算法不难,就是求各组最大值,不过文本的解析一向很慢,应当尽量用多线程,另外分组时要用hash方法,简单的遍历比较很慢。A2:多路游标,每路游标先按照第2列分组,再选出每组中第3列最大的值对应的记录。A1:读取文件source.csv中的内容,剥离引号,返回成多路游标。A4:将A3结果导入到文件result.csv。
2022-10-25 12:11:05 331
原创 同值列统计
用 sql 实现的话需要对每列嵌套查询,用 union 合并结果集成一列。当列数非常多的时候语句也要扩充。A1: 用一个 txt 文件作为源。导入 txt 文件数据,第一行作为列名。这个需求已经很简明,思路就是对数据行进行列转换,然后按值统计个数。字段名: a b c d e f。数据: 1 2 1 1 2 3。求,表 table 中数据为“1”的个数有多少?A2:将记录 1 转换成数组,按值分组计数。数据为“2”的个数有多少?数据为“3”的个数有多少?
2022-10-24 09:18:12 140
原创 动态列排序
A2:将每条记录的字段值转为序列,从该序列中取出数值成员作为A1的排序表达式进行排序。写好的脚本如何在应用程序中调用,可以参考。有人给出解答,楼主没回复。更多动态列的例子可参考。
2022-10-21 09:28:36 398
原创 sql 取最大值对应的记录
A2: 对A1按照typeid分组,取出每一种比赛中表现最棒的队员,也就是每组中playcount最大的那条记录。A1:sql取数,按照playerid,typeid分组统计计数。这个脚本可以方便的集成到应用程序中,具体可以参考。
2022-10-20 09:22:55 2287
原创 如何进行列间排序
A2:循环将A1每行记录的字段值通过array函数拼成序列,再通过sort函数排好序,最后通过record函数将每个序列成员当做字段值填入该条记录中。写好的脚本如何在应用程序中调用,可以参考。A1:从orders表中取数。
2022-10-19 09:37:18 140
原创 表名在数据库中,如何实现动态查询
A2:先按TableName分组,再对分组结果循环计算,拼接动态查询语句,最后把查询结果通过conj合并,并按照ID排序。拼接动态SQL只能在存储过程中完成了,但仍然非常复杂。集算器提供JDBC接口,架在数据库和程序之间像数据库一样使用。有3个表,A,B,C。我要得到如下数据:通过表A用ID关联。
2022-10-18 09:40:56 362
原创 分组后取前 N 条
正如你所说,各组前 N 列的问题应该用窗口函数来解决,但 MySQL 没有窗口函数,解决起来要麻烦许多。集算器可以通过 JDBC 与 JAVA 集成,就和使用数据为差不多,详细可参考。A2:按 category_id 分组。A1:SQL 取出表中数据。A3:在每组中取前四条。A4:将各组数据合并。
2022-10-17 08:44:34 229
原创 取分组后的第一条数据
但是,目前的数据库对窗口函数实现程度各有不同,有些根本就没有实现。如果按照 SQL92 的标准,得用 JOIN 拼出窗口函数中序号的效果,难度就很大了。如果按照 SQL2003 的标准,那么使用窗口函数可以解决你的问题,即:按 EmpNum 分组,按规则取出每组第一条,规则可以是:组内序号,某个字段的排序位置。集算器提供 JDBC 接口与 JAVA 程序或报表工具集成,与使用数据库差不多,详情可参考。更复杂的情况还可参考【
2022-10-14 09:09:08 491
原创 取分组后的第一条数据
但是,目前的数据库对窗口函数实现程度各有不同,有些根本就没有实现。如果按照 SQL92 的标准,得用 JOIN 拼出窗口函数中序号的效果,难度就很大了。如果按照 SQL2003 的标准,那么使用窗口函数可以解决你的问题,即:按 EmpNum 分组,按规则取出每组第一条,规则可以是:组内序号,某个字段的排序位置。集算器提供 JDBC 接口与 JAVA 程序或报表工具集成,与使用数据库差不多,详情可参考。更复杂的情况还可参考【
2022-10-14 09:08:20 346
原创 对两个 CSV 文件按记录序号关联
以记录序号为标准合并结构化文件,JAVA 缺乏结构化计算类库,实现起来难免困难。除了按序号合并,更常见的是按照某几个字段进行合并(类似 SQL 中的 join 语句),请参考【集算器不仅可以进行关联计算,还可以通过 JDBC 与 JAVA 集成,参考《A4:将结果输出到 result.csv 中。A3:按记录序号合并文件,取出所需字段。A1-A2:分别读取 CSV 数据。
2022-10-13 09:46:53 404
原创 分组汇总运算
分组汇总是典型结构化计算,JAVA本身缺少这方面的通行类库,硬编码非常麻烦。建议用SPL来辅助实现,代码简单易懂,也能方便地集成进Java(参考。A1:读取source.csv中的数据。A5:将结果导出到result.csv。A2:将Unix时间戳转换成日期类型。A3:将转换后的日期分组排序。A4:合并分组中的数据。
2022-10-12 11:30:13 401
原创 简单分组汇总
按照指定字段分组汇总,这是简单的结构化计算,但JAVA缺乏相应类库,代码会很难写。A1:读取文本文件source.txt中的内容。上述代码很容易集成到JAVA,参考。A2:按照第28个字段分组汇总。
2022-10-12 11:25:58 392
原创 分段分组
这其实是简单的分组汇总,只是不能直接按3rd和1st分组,而是要按段(固定区间)分组,比如3rd的区间可以这样设定:3rd 乘100除20,按整数部分分组。这样0.1和0.15都会落入0-0.2这个组。A2:对第3列和第1列进行计算后分组汇总,计算后3rd会显示组号0、1、2等。A1:读取文本文件source.txt中的内容。A3:将数据转为实际区间0、0.2、0.4。
2022-10-11 10:44:01 109
原创 分段分组
这其实是简单的分组汇总,只是不能直接按3rd和1st分组,而是要按段(固定区间)分组,比如3rd的区间可以这样设定:3rd 乘100除20,按整数部分分组。这样0.1和0.15都会落入0-0.2这个组。A2:对第3列和第1列进行计算后分组汇总,计算后3rd会显示组号0、1、2等。A1:读取文本文件source.txt中的内容。A3:将数据转为实际区间0、0.2、0.4。
2022-10-10 10:11:34 45
原创 分段分组
这其实是简单的分组汇总,只是不能直接按3rd和1st分组,而是要按段(固定区间)分组,比如3rd的区间可以这样设定:3rd 乘100除20,按整数部分分组。这样0.1和0.15都会落入0-0.2这个组。A2:对第3列和第1列进行计算后分组汇总,计算后3rd会显示组号0、1、2等。A1:读取文本文件source.txt中的内容。A3:将数据转为实际区间0、0.2、0.4。
2022-10-10 10:10:19 58
原创 分段分组
这其实是简单的分组汇总,只是不能直接按3rd和1st分组,而是要按段(固定区间)分组,比如3rd的区间可以这样设定:3rd 乘100除20,按整数部分分组。这样0.1和0.15都会落入0-0.2这个组。A2:对第3列和第1列进行计算后分组汇总,计算后3rd会显示组号0、1、2等。A1:读取文本文件source.txt中的内容。A3:将数据转为实际区间0、0.2、0.4。
2022-10-10 10:08:50 309
原创 大文本用组游标处理每一组计算
这个算法逻辑很清晰,while (thereAreGroupsRemaining) {String s = readNextGroup();process(s);但用JAVA实现这个算法的细节太多,代码不会很简单。A2就是while (thereAreGroupsRemaining)以及readNextGroup();B3就是process(s);A2就是s,即当前这组数据的所有记录。A2:读文件,每次将第一列中值相同的读入一组,放入内存,_1表示第一列。B3: 查询,找出第二列中以“foo”开头的记录。
2022-10-09 09:48:26 70
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人