SPL 查询与报表计算实战指南 - 1 针对分组子集的运算和处理

1 针对分组子集的运算和处理

对集合分组后,每组数据都是原集合的子集,也就是分组子集。这类难题是指分组后不需要立刻汇总,而是要保持分组子集继续计算。SQL分组后必须立刻汇总,不能直接保持分组子集用于继续计算,通常只能间接实现计算目标,代码很复杂。

1:找出人数大于5的部门并将员工按薪金排序

Picture2png

SPL代码:


A

1

$select * from Employee.txt

2

=A1.group(Dept)

3

=A2.select(~.len()>5).(~.sort(Salary))

4

=A3.conj()

A1:加载数据。

A2:使用group函数将订单按部门分组,但不汇总。

Picture3png

l 知识点:分组函数group

除了普通的分组汇总函数groupsSPL还有更基础的group函数,可以分组后保持每组的记录集合,供后续继续计算,而不是像SQL那样必须立刻汇总。每组的记录集合是原序表的记录(引用)的集合的子集,也叫分组子集。

Picture4png
参数 G1…Gi:分组表达式,可以是多个,表达式之间用逗号隔开。

A3:处理每组数据,先查出人数大于 5 的部门,再将这些部门内的员工按薪水排序。~ 是 SPL 保留字,表示当前组。函数 select 用于过滤,sort 用于排序,len 用于求集合的成员数量。

Picture5png
A4:用 conj 函数合并各部门的员工。

Picture6png

A2-A4是分步代码,便于调试,也可以合为一句:

A1.group(Dept). select(~.len()>5).conj(~.sort(Salary))

2:按客户及金额排序后的订单表只保留每组客户中第一个客户名称

数据源:订单表按客户和销售额排序后,可以观察到每个客户是一组数据,组内的订单按金额由小到大排列。

目标:保留每组的第一个客户,将组内其他记录的客户改成 null

Picture7png

SPL代码:


A

1

$select Client, OrderID, Amount from Orders.txt order by Client,Amount DESC

2

=A1.group(Client)

3

=A2.run(~.(if(#>1,Client=null)))

4

=A3.conj()

A1:加载数据。

A2:按客户分组,每组是一个集合。前2组如下图:

Picture8png
A3:用 run 函数修改各组数据,当成员在组内的序号大于 1 时,将客户改为 null。~ 表示当前组,# 表示组内序号。

Picture9png

A4:合并各组成员。

3:将相同ID的订单按规则进行二次分组实现去重

数据源:订单ID有重复的订单表(1\OrdersDup.txt)。

目标:去除重复的订单。先把相同的订单ID分到同一组,再根据组内的订单日期是否重复决定是否二次分组:如果无重复,则保留日期最近的订单;如果有重复,则将本组记录再按客户分小组,同样保留各小组日期最近的订单。处理数据后不必对订单ID重新编号。

Picture10png

SPL代码:


A

1

$select * from 1\OrdersDup.txt order by OrderDate desc

2

=A1.group(OrderID)

3

=A2.conj(if(~.icount(OrderDate)==~.count(), [~], ~.group(Client)))

4

=A3.(~(1))

A1:加载数据,日期近的记录排在前面。

Picture11png
A2:用 group 函数按订单 ID 分组,但不汇总,每组是一个集合。

Picture12png

A3=…(if(~.icount(OrderDate)==~.count(), [~], ~.group(Client)))处理每组数据,如果本组日期没有重复,则返回当前组,比如第 1 组;否则将当前组按客户继续分组,同样不汇总,而是返回每个小组,也就是集合的集合,比如第 2、3 组。~ 表示当前组。函数 icount 用于统计不重复的成员数量。函数 count 用于统计所有的成员数量。[]是集合符号,因为 ~ 本身是集合,所以 [~] 是集合的集合,这样处理可以使数据结构前后一致,方便统一处理。

Picture13png
conj(…) 合并处理后的各组数据的成员,让每组数据从 2 层集合(集合的集合)上升为单层集合。

Picture14png
A4:统一处理 A3 的各组数据:取当前组的第 1 条记录, .(1) 表示当前组的第 1 个成员,简写做1。

Picture15png

扩展阅读

(https://c.raqsoft.com.cn/article/1737544681663)
(https://c.raqsoft.com.cn/article/1736566315971)
(https://c.raqsoft.com.cn/article/1744883172421)
(https://c.raqsoft.com.cn/article/1745224008015)
(https://c.raqsoft.com.cn/article/1734057743749)
(https://c.raqsoft.com.cn/article/1739435733815)