group by 子句使用说明
欢迎使用社区 Markdown 编辑器写文章!
相关链接:Q:group by 子句使用说明
语法
[GROUP BY <expression[1,2,..,n]> [HAVING ]]
说明
group by 语句是通过列的引用对数组进行分组后汇总数据。
GROUP BY 子句一般包含以下场景的使用:
1、thisgroup:返回分组后各组内详情,即上层 select 语句中 group by 分组后的当前组的记录,是一个表,对它访问需要嵌套 select 子语句。
例如 select 子句按照字段 A 进行分组,thisgroup 在运行时指定的是当前行的字段 A 的值按照 A 分组后的行集,相当于 select * from table where [‘A’]=thisrow [‘A’] end;
2、聚集函数:分组后,对各组的简单统计应用,参考:FAQ:聚集函数;
3、having:用于分组后组内数据的筛选,常用用聚集函数作为条件,与分组前对数据进行筛选的 where 不同;
4、多个值分组:将用于分组的多个值在 Group By 后用逗号分隔即可;
5、自定义分组模型:可以对分组列的值自定义模型筛选后分组;
6、refsof:访问上级表的行集或者表达式。
使用范例
范例 1:thisgroup
访问组内详情
// 分组后,并返回各组具体详情。是一个表,访问需要用 select
Table1 := Array(
(“A”:2,”B”:2),
(“A”:2,”B”:5),
(“A”:2,”B”:3),
(“A”:8,”B”:3),
(“A”:4,”B”:41),
(“A”:4,”B”:54));
return select [‘A’], // 返回分组字段
Avgof ([‘B’]) as ‘AvgB’, // 聚集函数,返回该组内 B 列的平均值
select * from thisgroup end as ‘group’// 分组后当前组内的详细记录
from Table1 group by [‘A’] order by [‘A’] end;// 按 A 列分组,且最终结果按 A 列排序
结果:
点开第一个 group 展开如下:
范例 2:聚集函数的使用
聚集函数:分组后,对各组的简单统计应用
// 将行按 [“A”] 进行分类,然后在每个分类中进行 sumof ([“B”]) 操作。
Table1 := Array(
(“A”:2,”B”:2),
(“A”:2,”B”:5),
(“A”:2,”B”:3),
(“A”:8,”B”:3),
(“A”:4,”B”:41),
(“A”:4,”B”:54) );
Return Select [“A”],
sumof([“B”]) as “SumB”
from Table1 GROUP BY [“A”] end;
结果:
范例 3:HAVING 的应用
HAVING:分组后对组的筛选
// 指定结果集中,将行按 [“A”] 进行分组,然后在每个分类中进行 sumof ([“B”]) 操作。
// 返回得出的结果中 Sumof ([“B”])>4 的分组。
Table1:= Array(
(“A”:2,”B”:2),
(“A”:2,”B”:5),
(“A”:2,”B”:3),
(“A”:8,”B”:3),
(“A”:4,”B”:41),
(“A”:4,”B”:54) );
Return Select [“A”],
sumof([“B”]) as “SumB”
from Table1 GROUP BY [“A”] HAVING SUMOF([“B”])>4 end;
结果:
范例 4:多个值分组
将用于分组的多个值在 Group By 后用逗号分隔即可
// 按 [‘A’],[“B”] 列的值分组后对 [‘C’] 列的值进行聚类分析
Table1 := Array(
(“A”:0,”B”:0,”C”:10),
(“A”:0,”B”:1,”C”:15),
(“A”:0,”B”:0,”C”:15),
(“A”:0,”B”:1,”C”:20),
(“A”:1,”B”:0,”C”:15),
(“A”:1,”B”:1,”C”:15),
(“A”:1,”B”:0,”C”:20),
(“A”:1,”B”:1,”C”:10));
return select [‘A’],[“B”],
Avgof([‘C’]) as ‘AvgB’,
Sumof([‘C’]) as ‘SumB’
from Table1 group by [‘A’],[“B”] end;
结果:
范例 5:自定义条件分组
// 对 A 股股价进行聚类,返回聚类中股票个数大于 10 的聚类,得到每个聚类的股票个数以及平均价格:
return SELECT GetStockPriceType ([“close”]) AS “价格分类”,
AvgOf ([“close”]) AS “平均价格”,
COUNTOF ([‘StockID’]) AS “个数”
FROM MarketTable
DateKey today() to today()
OF GetBK (“深证 A 股;上证 A 股”)
GROUP BY GetStockPriceType([“close”]) Having COUNTOF([‘StockID’])>10
END;
//GetStockPriceType 函数的定义如下:
function GetStockPriceType(c);
begin
return
ifthen (c>15,” 高价股”,ifthen (c>5,” 中价股”,” 低价股”));
end;
结果:
价格分类 平均价格 个数
中价股 8.861672 939
高价股 44.972328 567
低价股 3.378094 509
范例 6:RefsOf 访问上级结果集
//// 表 M 按 [2] 分组后求 [0] 的和,同时返回分组后行集中 [0] 的最大值所在行对应 [1] 的值。
m := array(
(0.86,0.08,’A’),
(0.74,0.89,’A’),
(0.17,0.82,’A’),
(0.33,0.99,’B’),
(0.09,0.45,’B’),
(0.92,0.26,’C’),
(0.57,0.26,’C’));
return select sumof([0]) as ‘total-0’,
(vselect [1] from thisgroup where [0]=refsof(maxof([0]),1) end) as ‘max-0-1’
from m group by [2] end;
结果:
本作品采用《CC 协议》,转载必须注明作者和本文链接