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 |
| … | … | … |
