多条记录作为汇总值参与进一步计算。
| ?????? |
A |
?B |
| 1 |
=db.query("select * from 股价表") |
? |
| 2 |
=A1.groups(股票;top(2,-交易日)) |
最后2个交易日的数据 |
| 3 |
=A2.new(股票,#2(1).收盘价-#2(2).收盘价:涨幅) |
计算涨幅 |
聚合函数并不会先计算出分组子集,而是直接在已有结果上累积,这样可获得更高的性能,而且在数据量大到内存放不下时还可以基于游标工作。
?
如果数据已有序,则可以更高效地用位置取出相应记录:
| ??????? |
A |
B? |
| 1 |
=db.query("select * from 股价表 order by 交易日 desc") |
? |
| 2 |
=A1.groups(股票;top(2,0)) |
直接取前2条 |
| 3 |
=A2.new(股票,#2(1).收盘价-#2(2).收盘价:涨幅) |
? |
取出最大值对应记录、第1条最后1条等类似计算都是topN聚合的特例了。?
?
逆分组
?
与分组汇总相反,逆分组指将汇总数据拆分成多条明细数据。这种情况不多见,但碰到了用SQL很难处理,这里仅举一例。
?
分期付款表结构为:编号、总金额、起始日、总期数;要将每笔贷款拆分成多期记录,结构为:编号、期数、还款日、金额。总金额将简单地平均分配到每一期,一期为一个月。
?
从明细到汇总很容易,反过来就困难很多,用SQL将记录数变多一般是和一个序号表JOIN或用递归查询,思路都不直接。而用集算器则按常规思路写出来即可:
| ?? |
A |
| 1 |
=db.query("select * from 分期付款表") |
| 2 |
=A1.news(总期数;编号,~:期数,after@m(起始日,~-1):还款日,总金额/总期数:金额) |