聚合分析和分组

SQL提供了一些列的聚集函数对表中的数据进行统计分析,在SQL中可以使用分组命令将列中的数据按照一定的条件进行分组。一般只将聚合函数作用在满足条件的分组上。因此聚合函数与分组命令一般结合使用.常见的聚合函数有sum(),max(),min( ),avg( ),count( )

1、sum( column_name)

求某列的所有非空数值之和

eg1:求所有女教师的工资总和

 

结果:

 

 

2、count(*)和count(column_name)

查询结果:

从这个结果分析:count(*)执行求出的是表的总行数(包括有null值的行),而count(column_name)计算的是这一列中非null数据的行数。此外count可以对进行连接操作后的列进行计数操作,有连接运算符一节可以知道只要参与连接的列中有一列为null,则连接的结果都为null。count对连接后的列进行计数,同样不包括列值为null的行在内。因此上述查询结果的后面两列的行数均为8.

 

2、最大/最小值函数max( )/min( )

注意:

SQL不支持如下的select语句:

 

理由:聚合函数处理的是数据组,在这里max()和avg()函数都是将这个表看成一组,而tname,dname,tsex都没有进行分组。上面两个不正确的例子中第二个例子可以改写为子查询的方式来返回最大值。代码如下:

 

 

说明:

  • max( ),min( )函数还可以用于字符型数据,时间型数据。例如

 

  • 确定最大值(最小值)时,max()或者min()函数都会忽略null值,但是如果在该列中,所有行的值都是null,则max()或者min()函数将返回null

3、avg()函数

eg1:avg()函数对null值的处理

从teacher表中查询所有教师的平均工资

 

查询结果:

由上述结果可以知道,avg()函数将忽略null列的值,将总的数值数除以非空行数,得到平均值。

 

eg2:用where子句来限制用于计算平均值的行

从teacher表中查询所有计算机系的教师的平均年龄

 

计算结果:

为什么能够有条件的计算平均值?

--------这与select语句的执行顺序是分不开的。where子句在select子句之前执行,排出了不符合条件的行,剩下的行才参与avg()函数的计算。

 

4、组合查询

(1)分组的语法:

select  column ,sum(column)

from teacher

group by column

eg1:从teacher表中查询男教师和女教师的平均工资

 

查询结果:

(2)group by 根据多个字段进行分组,

eg2:

 

查询结果:

 

(3)rollup运算符(略)

(4)cube运算符(略)

(5)group by 对null值的处理

group by子句将所有null值作为一组,也就是说在group by子句中认为null和null的值是“相等”的

eg:

 

查询结果:

从结果可以看出,工资为null的被分为一个组做统计

 

(6)having子句

  • 当having子句和group by子句在一起使用时,having子句用于对group by 分组后的各个组进行筛选,去除掉每个分组中不符合having子句条件的分组。

eg:从teacher表中查询至少有两位老师的系及教师人数。实现代码:

执行结果:

  • having子句和where子句都是用于筛选,两者的异同

-------第一,如果查询语句中有group by 子句,则having子句只能作用于group by 分成的各个分组

   第二,如果没有group by 子句,有where子句的输出,并把这个输出作为一个分组

 第三,如果既没有group by子句,也没有where子句,那么having子句作用与from子句的输出,并将这个输出作为一个分组。

这三点和前面谈到的select语句执行顺序有关http://blog.csdn.net/qinyushuang/archive/2010/12/31/6109037.aspx

综上,where子句只可以作用域select语句,而having子句可以作用于group by ,where子句,select子句的输出,具体作用于哪个子句,就上上面所说的三点说明。

eg1:

从teacher表中查询有女教师的系,及其拥有女教师的数量

 

执行结果:

 

eg2:一个错误的例子

 

执行出错,原因:包括在having子句中的列必须是分组的列

 

eg3:having子句作用where子句的一个例子

 

执行结果:

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Elasticsearch 聚合分组是为了对数据进行聚合和分类的操作。通过聚合,可以从多个文档或字段中获取统计信息,例如计算平均值、总和或占比等。分组则是将文档按照某个字段进行分类,例如将客户按照地域分组。这样可以方便地对数据进行分析和可视化。 ### 回答2: Elasticsearch是一个广为使用的开源搜索引擎,它具有强大的聚合能力,可以对数据进行分组、过滤、排序等操作。在Elasticsearch中,聚合是一个非常重要的功能,它可以从一组文档中抽取统计信息,并将其返回给用户。 聚合分组的概念是密不可分的,聚合操作通常需要通过分组操作来实现。通过聚合分组操作,我们可以将数据按照某个字段进行分类,比如说对商品按照价格进行分组,或者将用户按照地理位置进行分组等。为了更好地理解聚合分组的概念,下面将分别解释这两个概念,在此基础上再介绍如何在Elasticsearch中进行聚合分组操作。 什么是聚合聚合是指对一组数据进行统计和分析的过程,通过聚合操作,我们可以从数据中获得一些有价值的信息,比如说总数、平均值、最大值、最小值、分布情况、占比等等。 在Elasticsearch中,聚合是一种高级查询方式,可以在搜索结果中对数据进行进一步深入地挖掘,比如:常见的数据统计:例如通过terms统计某一列中每个值的数量,通过avg统计某一列的平均值,通过max统计某一列的最大值等。 什么是分组分组指的是按照某个字段对一组数据进行分组,将数据分成多个子集,在每个子集中进行聚合操作,最终将各个子集的结果合并得出整体结果。在Elasticsearch中,分组是通过聚合操作来实现的,可以通过terms聚合来对数据进行分组,也可以通过date_histogram聚合对时间数据进行分组。 如何在Elasticsearch中进行聚合分组操作? Elasticsearch提供了丰富的聚合功能,可以通过简单的组合实现复杂的聚合操作。比如说,可以使用terms聚合来对数据进行分组,然后使用sum聚合来计算每个分组的总和。下面给出一个示例代码: ``` GET /my_index/_search { "size": 0, "aggs": { "group_by_price": { "terms": { "field": "price" }, "aggs": { "total_sales": { "sum": { "field": "sales" } } } } } } ``` 在上面的代码中,我们使用terms聚合来对数据进行分组,将数据按照price字段进行分组,然后使用sum聚合来计算每个分组的销售总数。这个例子只是聚合功能的冰山一角,在实际应用中,我们还可以使用Elasticsearch提供的其他聚合操作来实现更复杂的统计和分析需求。 通过上述方法和示例,我们可以看出,Elasticsearch的聚合分组功能非常强大,可以快速地对大规模的数据进行统计和分析。对于需要进行数据分析和报告的企业和用户来说,Elasticsearch聚合分组功能是绝对值得掌握和使用的。 ### 回答3: elasticsearch 是一款基于 Lucene 的开源搜索引擎。除了基本的文本搜索外,它还提供了强大的聚合分组功能。 聚合是一种将多个文档组合在一起分析的方法,其结果可以是平均值、最大值、最小值等。可以使用 `aggs` 参数将查询结果进行聚合,常见的聚合类型有: - Bucket 聚合:将多个文档按照某种标准分组,使用 `terms` 或 `histogram` 等聚合函数实现。 - Metrics 聚合:计算符合条件的文档中某个字段的统计值,比如 `average`、`sum`、`max`、`min` 等聚合函数。 例如,以下查询使用 `terms` 聚合函数将所有文档按照 `age` 字段的值分为不同的组,并计算每组的文档数和平均年龄: ``` GET /_search { "size": 0, "aggs": { "age_buckets": { "terms": { "field": "age" }, "aggs": { "avg_age": { "avg": { "field": "age" } } } } } } ``` 分组是基于聚合的一种操作,是指将聚合后的结果按照某种标准进行分组。比如,可以使用 `nested` 和 `reverse_nested` 参数实现嵌套分组,使用 `min_doc_count` 设置分组最小文档数量。例如,以下查询将所有文档按照 `age` 和 `gender` 字段进行分组,并分别计算每组的文档数和平均年龄,然后再按照 `age` 进行反向分组: ``` GET /_search { "size": 0, "aggs": { "age": { "terms": { "field": "age" }, "aggs": { "gender": { "terms": { "field": "gender" }, "aggs": { "avg_age": { "avg": { "field": "age" } } } } } }, "reverse_age": { "reverse_nested": {}, "aggs": { "avg_age": { "avg": { "field": "age" } } } } } } ``` 总之,elasticsearch 的聚合分组功能十分强大,可以根据实际需求进行灵活配置,以实现更精确的查询结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值