【和SQL对比】针对累计值过滤
找出销售额占到一半的前n个客户,并按销售额从大到小排序
SQL解法
with A as (select 客户,销售额,row_number() over (order by 销售额) 排名 from 客户销售表) select 客户,销售额 from (select 客户,销售额,sum(销售额) over (order by 排名) 累计额 from A) where 累计额>(select sum(销售额)/2 from 客户销售表) order by 销售额 desc
这里事实上是销售额从小到大的累计值,反过来找出不在后一半客户的客户,否则很难处理恰好要过线的那个客户,这样会导致进行两次方向不同的排序。而且由于窗口函数在计算累计值时对销售额相同值的处理问题,需要再做子查询先计算排名。
SPL解法
A | ||
1 | =demo.query(“select * from 客户销售表”).sort(销售额:-1) | |
2 | =A1.cumulate(销售额) | 计算累计序列 |
3 | =A2.m(-1)/2 | 最后的累计值即是总和 |
4 | =A2.pselect(~>=A3) | 超过一半的位置 |
5 | =A1(to(A4)) |
使用SPL则只要按常规理解的过程查找。