06分组统计查询

分组函数:

统计函数COUNT()/SUM()/MIN()/MAX()/AVG()

 例:

SLEECT COUNT(*) 人数, SUM(sal) 总薪资,MIN(sal)最低薪资,MAX(sal)最高薪资,AVG(sal)平均薪资 FROM emp;

COUNT()函数有三种表现形式:

COUNT(*):可以返回表中所有的记录数

COUNT(字段):统计不为空的所有数据

COUNT(DISTINCT 字段):消除重复数据的结果

 

select语句中每一个限定都是有执行顺序的:下面的1、2、3、4、5符号代表执行顺序。

4 select (distinct) 列名【别名】,列名【别名】,,。。。

1 from 表名【别名】

2【Where 条件限定】;

3 GROUP BY

HAVING 字句(必须跟GROUP BY一起出现),where是在GROUP BY之前执行的,所以where是不能跟统计函数的;所以用HAVING在GROUP BY之后做条件筛选,直接使用统计函数;

5 ORDER BY 列名 ASC/DESC

--from先执行,再到where,到group by,到select,最后是order by

 

例:

SELECT job,count(*),min(sal),max(sal)

FROM emp

GROUP BY job;

 

GROUP BY约定条件:

1.如果查询不使用GROUP BY子句,那么SELECT字句只允许出现统计函数,其他任何字段不允许出现。

例SELECT empno,COUNT(*) FROM emp;这是错误的。因为这里没有group by子句,

 

2.如果查询使用了GROUP BY子句,那么SELECT子句只允许出现统计函数、分组字段,其他任何字段都不允许出现;

例SELECT empno,job,COUNT(*) FROM emp GROUP BY job;是错误的;

--这里的分组字段是job,所以select字句只允许出现统计函数和job;

 

3.如果查询使用了嵌套函数,那么SELECT子句只允许出现嵌套函数,不允许出现任何字段包括分组字段。

 

例:查询每个部门的编号、名称、位置、部门人数、平均工资

数据表:

-dept:编号、名称、位置

-emp:统计数据:部门人数、平均工资

确定已知关联字段:

-雇员与部门:emp.deptno=dept.deptno;

1.查询部门的编号、名称、位置、部门人数用雇员编号(count())、工资(AVG())

SELECT d.deptno,d.dname,d.loc,e.empno,e.sal

FROM emp e,dept d

WHERE e.deptno(+)=d.deptno;

 

2.发现三个重复d.deptno,d.dname,d.loc

SELECT d.deptno,d.dname,d.loc,COUNT(e.empno),AVG(e.sal)  --只能出现分组字段d.deptno,d.dname,d.loc

FROM emp e,dept d

WHERE e.deptno(+)=d.deptno

GROUP BY d.deptno,d.dname,d.loc;

 

 HAVING 字句

例:查询出每个职位的名称、平均工资,但是要求职位的平均工资高于2000

如果用以下代码是错误的:

SELECT job,AVG(sal)

FROM emp

WHERE AVG(sal)>2000(主要是因为WHERE字句不能直接使用统计函数,因为统计函数是在分组函数执行后才出现的,这样的话按照数据库执行顺序会先执行WHERE后执行GROUP BY,但是此时WHERE还不能使用统计函数;HAVING可以直接使用统计函数;

GROUP BY job;

应改为:

SELECT job,AVG(sal)

FROM emp

 GROUP BY job

HAVING AVG(sal)>2000;

 

范例:

1.显示所有非销售人员的工作名称以及从事同一工作的雇员的月工资的总和;并且要求满足从事同一工作月工资的合计大于5000,显示的结果按照月工作的合计的升序排列;

 

SELECT job,SUM(sal)

FROM emp

WHERE  job<>'salesman'

GROUP BY job

HAVING SUM(sal)>5000

ORDER BY SUM(sal) ASC;

 

2.统计所有销售人员(领取佣金)和非销售人员(不领取佣金)的平均工资和人数;

-先统计领取佣金的

SELECT COUNT(*),AVG(sal)

FROM emp

WHERE comm IS NOT NULL;

 

-统计不领取佣金的

SELECT COUNT(*),AVG(sal)

FROM emp

WHERE comm IS NULL;

 

-最后用UNION连接起来

SELECT COUNT(*),AVG(sal)

FROM emp

WHERE comm IS NOT NULL

UNION

SELECT COUNT(*),AVG(sal)

FROM emp

WHERE comm IS NULL;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

### 回答1: 要将一组时间按24小时制进行分组统计,可以使用Elasticsearch的Terms Aggregation和Date Histogram Aggregation。首先将时间字段设置为date类型,然后使用Date Histogram Aggregation按小时分组,再在内部使用Terms Aggregation统计每个小时的数量。 以下是一个按24小时制进行分组统计的例子: 假设我们有一个索引,包含以下文档: ```json [ { "time": "2022-06-01T00:00:00Z" }, { "time": "2022-06-01T01:00:00Z" }, { "time": "2022-06-01T01:30:00Z" }, { "time": "2022-06-01T02:00:00Z" }, { "time": "2022-06-01T03:00:00Z" }, { "time": "2022-06-01T04:00:00Z" }, { "time": "2022-06-01T05:00:00Z" }, { "time": "2022-06-01T06:00:00Z" } ] ``` 我们可以使用以下查询来按24小时制进行分组统计: ```json { "aggs": { "hourly": { "date_histogram": { "field": "time", "interval": "hour", "format": "HH" }, "aggs": { "count": { "value_count": { "field": "time" } } } } } } ``` 该查询使用Date Histogram Aggregation按小时分组,并设置“format”参数为“HH”,表示按24小时制进行分组。然后在内部使用Terms Aggregation统计每个小时的数量。 查询结果如下: ```json { "aggregations" : { "hourly" : { "buckets" : [ { "key_as_string" : "00", "key" : 0, "doc_count" : 1, "count" : { "value" : 1 } }, { "key_as_string" : "01", "key" : 1, "doc_count" : 2, "count" : { "value" : 2 } }, { "key_as_string" : "02", "key" : 2, "doc_count" : 1, "count" : { "value" : 1 } }, { "key_as_string" : "03", "key" : 3, "doc_count" : 1, "count" : { "value" : 1 } }, { "key_as_string" : "04", "key" : 4, "doc_count" : 1, "count" : { "value" : 1 } }, { "key_as_string" : "05", "key" : 5, "doc_count" : 1, "count" : { "value" : 1 } }, { "key_as_string" : "06", "key" : 6, "doc_count" : 1, "count" : { "value" : 1 } } ] } } } ``` 可以看到,每个小时的数量都被正确地统计了。 ### 回答2: Elasticsearch是一个开源的分布式搜索与分析引擎,提供了强大的全文搜索、日志分析以及数据可视化功能。在Elasticsearch中,我们可以按照需求进行数据的分组统计,包括按照24小时制进行分组统计。 要按照24小时制进行分组统计,我们可以结合Elasticsearch的聚合(Aggregation)功能和日期范围查询(Range Query)来实现。下面是实现的步骤: 1. 创建一个索引,并确定需要统计的字段类型为日期类型。 2. 使用聚合功能进行分组统计,可以使用date_histogram聚合来按照特定的时间间隔进行分组。在这里,我们可以将时间间隔设置为1小时来实现按照24小时制进行分组。 3. 在聚合中使用range参数来指定时间范围,确保只统计在指定的时间范围内的数据。 4. 可以选择统计指定字段的计数、求和、平均值等等。 以下是一个示例的查询语句,用于按照24小时制进行分组统计: ``` GET /your_index/_search { "size": 0, "aggs": { "hourly_stats": { "date_histogram": { "field": "your_date_field", "interval": "1h", "format": "HH:mm" }, "aggs": { "your_statistic": { // 指定需要统计的字段和统计类型 "your_statistic_type": { "field": "your_field" } } } } }, "query": { "range": { "your_date_field": { "gte": "start_time", "lte": "end_time" } } } } ``` 在以上示例中,我们使用了date_histogram聚合按照1小时的时间间隔进行分组统计。同时,我们使用了range查询来限定需要统计的时间范围。在聚合内部,我们可以指定需要统计的字段和统计类型,如计数、求和等等。 通过以上的查询语句,我们可以获得按照24小时制进行分组统计的结果,并进行进一步的数据分析和可视化处理。 ### 回答3: Elasticsearch 是一个流行的分布式搜索和分析引擎,可以用于搜索、分析和存储大量数据。要按24小时制进行分组统计,在 Elasticsearch 中可以使用时间字段和聚合操作来实现。 首先,确保你的数据中有一个时间字段,例如一个包含时间戳的字段。可以通过在文档中添加一个字段,例如 "@timestamp" 来保存时间戳。 接下来,你可以使用 Elasticsearch 的日期直方图聚合(date histogram aggregation)来按24小时制分组统计。该聚合操作可以将数据按指定的时间间隔划分为不同的时间段,并计算每个时间段的统计值。 例如,假设你的索引名为 "my_index",时间字段为 "@timestamp",你可以使用以下查询来按24小时制进行分组统计: ``` GET my_index/_search { "size": 0, "aggs": { "hourly_stats": { "date_histogram": { "field": "@timestamp", "interval": "1h", "format": "HH:mm" }, "aggs": { "avg_price": { "avg": { "field": "price" } } } } } } ``` 该查询将返回按小时分组统计数据,统计每个时间段内的平均价格。 需要注意的是,要正确地按24小时制进行分组统计,需要设置 "format" 参数为 "HH:mm" 这样的时间格式。根据你的需求,你可以调整 "interval" 参数来更细粒度地划分时间段,例如分钟、秒等。 总结起来,通过使用 Elasticsearch 的日期直方图聚合(date histogram aggregation),并设置合适的时间格式和间隔,就可以按照24小时制进行分组统计。使用类似的聚合操作,你还可以进行更多统计和分析,例如最大值、最小值、总和等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值