【和SQL对比】对分组结果过滤

有多少部门的平均年龄超过30岁或有三个以上员工年龄超过40岁

SQL解法

select count(*)
from (select 部门 from 员工表
      group by 部门
      having avg(年龄)>30 or
                sum( case when 年龄>40 then 1 else 0 end )>3)

分组的本意是将源集合拆分成若干子集,但SQL无法保存这种集合的集合,强迫计算出汇总值,继续针对子集合的过滤计数就需要转换成条件求和,而对结果集的再次汇总则要用嵌套的子查询完成。

SPL解法

A
1 =demo.query(“select * from 员工表”).group(部门)
2 =A1.count(~.avg(年龄)>30 || ~.count(年龄>40)>3)

SPL可以保持分组结果,即集合的集合,按思维过程计算即可。