【和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则只要按常规理解的过程查找。