非常规聚合问题举例

1.     枚举分组后聚合求和【例 1】 从城市 GDP 表中,分别统计直辖市、一线城市和二线城市的人均 GDP。城市 GDP 表部分数据如下:IDCityGDPPopulation1Shanghai3267924182Beijing3032021713Shenzhen2469112534Guangzhou2300014505Chongqing203633372…………【SPL 脚本】AB1=connect("db")/连接数据库2=A1.query("select * from GDP")/查询城市 GDP 表3[["Beijing","Shanghai","Tianjing","Chongqing"].pos(?)>0,["Beijing","Shanghai","Guangzhou","Shenzhen"].pos(?)>0,["Chengdu","Hangzhou","Chongqing","Wuhan","Xian","Suzhou","Tianjing","Nanjing","Changsha","Zhengzhou","Dongguan","Qingdao","Shenyang","Ningbo","Kunming"].pos(?)>0]/枚举直辖市、一线城市和二线城市4=A2.enum@r(A3,City)/按城市枚举分组5=A4.new(A3(#):Area,~.sum(GDP)/~.sum(Population)*10000:CapitaGDP)/统计每组的人均 GDP。其中用到了函数 sum() 求和A5的执行结果如下:AreaCapitaGDP["Beijing","Shanghai","Tianjing","Chongqing"].pos(?)>0107345.03["Beijing","Shanghai","Guangzhou","Shenzhen"].pos(?)>0151796.49["Chengdu","Hangzhou","Chongqing","Wuhan","Xian","Suzhou","Tianjing","Nanjing","Changsha","Zhengzhou","Dongguan","Qingdao","Shenyang","Ningbo","Kunming"].pos(?)>0106040.572.     合并重叠的时间区间【例 2】 将客户 ANATR 有重复时间段的订单记录合并。客户表部分数据如下:OrderIDCustomerSellerIdOrderDateFinishDate10308ANATR72012/09/182012/10/1610309ANATR32012/09/192012/10/1710625ANATR32013/08/082013/09/0510702ANATR12013/10/132013/11/2410759ANATR32013/11/282013/12/26……………【SPL脚本】AB1=connect("db")/连接数据源2=A1.query("select * from Orders where   Customer='ANATR'order by OrderDate")/选出客户 ANATR 的订单信息,按订单日期排序3=A2.group@i(OrderDate>max(FinishDate[,-1]))/当订单日期大于前面所有订单的完成日期时分到新组4=A3.new(Customer,~.min(OrderDate):OrderDate,~.max(FinishDate):FinishDate)/使用函数 min() 计算每组最早的订单日期作为订单日期,使用函数 max 计算最晚的订单日期作为完成日期A4的执行结果如下:CustomerOrderDateFinishDateANATR2012/09/182012/10/17ANATR2013/08/082013/09/05ANATR2013/10/132013/11/24ANATR2013/11/282013/12/29………3.     在分组聚合中统计满足条件的数量【例 4】 求一班各科不及格人数。成绩表部分数据如下:CLASSSTUDENTIDSUBJECTSCOREClass   one1English84Class   one1Math77Class   one1PE69Class   one2English81Class   one2Math80…………【SPL 脚本】AB1=connect("db")/连接数据库2=A1.query("select * from Scores where   CLASS='Class one'")/查询一班学生成绩3=A2.groups(SUBJECT;   count(SCORE<60):FailCount)/分组汇总,其中用到了函数 count() 统计不及格人数A3的执行结果如下:SUBJECTFailCountEnglish2Math0PE24.     在布尔值构成的集合中,聚合时执行逻辑与运算【例 5】 根据一系列某小学在线教学终端调查表,查看是否所有学生都能够使用手机。各班问卷及汇总目录如下:

IDSTUDENT_NAMETERMINAL1Rebecca   MoorePhone2Ashley   WilsonPhone,PC,Pad3Rachel   JohnsonPhone,PC,Pad4Emily   SmithPhone,Pad5Ashley   SmithPhone,PC6Matthew   JohnsonPhone7Alexis   SmithPhone,PC8Megan   WilsonPhone,PC,Pad………【SPL 脚本】ABC1=directory@ps("D:/Primary   School")/递归遍历目录,列出所有文件2for A1=file(A2).xlsimport@t()/循环导入各班级问卷 excel 文件3=B2.([TERMINAL,"Phone"].ifn().split@c().pos("Phone")   > 0)|@/当问卷中终端未填写时不认为不支持手机终端,使用函数 ifn() 保证此项为 true。4=B3.cand()/使用函数 A.cand() 计算 B3 的成员是否都是 trueA4的执行结果如下:Valuefalse5.     在布尔值构成的集合中,聚合时执行逻辑或运算【例 6】 查询客户 RATTC,在 2014 年是否排进过单月销售额的前三名。销售表部分数据如下:OrderIDCustomerSellerIdOrderDateAmount10400EASTC12014/01/013063.010401HANAR12014/01/013868.610402ERNSH82014/01/022713.510403ERNSH42014/01/031005.910404MAGAA22014/01/031675.0……………【SPL脚本】AB1=connect("db").query("select   * from sales")/连接数据源,读取销售表2=A1.select(year(OrderDate)==2014)/选出 2014 年数据3=A2.group(month(OrderDate))/将 2014 年的数据按照月份分组4=A3.(~.groups(Customer;   sum(Amount):Amount))/分组后的成员按照客户分组汇总销售额5=A4.new(~.top(-3; Amount):Top3)/循环每个月的数据,计算每月销售额前 3 的客户6=A5.(Top3.(Customer).pos("RATTC")>0)/判断每个月前三名是否包含客户 RATTC7=A6.cor()/使用函数 A.cor() 计算 A6 的成员是否存在 trueA7的执行结果如下:Valuefalse《SPL CookBook》中还有更多相关计算示例。

(0)

相关推荐