【和SQL对比】针对累计值过滤

找出销售额占到一半的前n个客户,并按销售额从大到小排序
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

这里事实上是销售额从小到大的累计值,反过来找出不在后一半客户的客户,否则很难处理恰好要过线的那个客户,这样会导致进行两次方向不同的排序。而且由于窗口函数在计算累计值时对销售额相同值的处理问题,需要再做子查询先计算排名。

A
1 =demo.query(“select * from 客户销售表”).sort(销售额:-1)
2 =A1.cumulate(销售额) 计算累计序列
3 =A2.m(-1)/2 最后的累计值即是总和
4 =A2.pselect(~>=A3) 超过一半的位置
5 =A1(to(A4))

使用集算器则只要按常规理解的过程查找。