6.7 按序号对齐分组:每组最多保留一条记录
按指定的序号顺序将数据排序,每组保留最多一个匹配成员。适用于我们希望按照指定顺序查看或者使用数据的情况。
根据每日销售表,按每周一到周日的顺序查询销售记录。部分数据如下:
Week | Day | Amount |
---|---|---|
5 | Sunday | 1101.2 |
5 | Saturday | 538.6 |
5 | Friday | 2142.4 |
5 | Thursday | 1456.0 |
5 | Wednesday | 48.0 |
5 | Tuesday | 1376.0 |
5 | Monday | 676.0 |
4 | Sunday | 448.0 |
4 | Saturday | 4031.0 |
4 | Friday | 364.8 |
… | … | … |
在 SPL 中函数 A.align(n,y) 用于对齐分组 ,直接划分为 n 个组(从 1 到 n),并根据分组表达式 y 直接计算出每个成员对应的组号。默认每组保留最多一个匹配成员。
脚本:
A | |
---|---|
1 | =T(“DailySales.csv”) |
2 | [“Monday”,“Tuesday”,“Wednesday”,“Thursday”,“Friday”,“Saturday”,“Sunday”] |
3 | =A1.group(Week; ~.align(7,A2.pos(Day)):WeekSales) |
4 | =A3.conj(WeekSales) |
5 | =A4.select(~) |
A1:查询每日销售表。
A2:定义从周一到周日的序列。
A3:销售数据按周分组时,使用函数 A.align(n,y) 将每周的销售记录,按照 A2 定义好的顺序进行对齐。这里值得注意的是,对齐分组可能会有空组。例如当第二周的周五和周六没有销售记录时,仍然会产生每周 7 个小组:
Week |
---|
[2,Monday,1194.0] |
[2,Tuesday,1622.4] |
[2,Wednesday,319.2] |
[2,Thursday,802.0] |
(null) |
(null) |
[2,Sunday,2123.2] |
A4:将每周排序后的销售记录合并。
A5:从结果集中选出非空的记录。
运行结果:
Week | Day | Amount |
---|---|---|
1 | Monday | 3063.0 |
1 | Tuesday | 3868.6 |
1 | Wednesday | 2713.5 |
1 | Thursday | 1005.9 |
1 | Friday | 1675.0 |
1 | Saturday | 400.0 |
1 | Sunday | 2018.2 |
2 | Monday | 1194.0 |
2 | Tuesday | 1622.4 |
2 | Wednesday | 319.2 |
… | … | … |