mysql_group by与聚合函数order by联合使用

Posted jingsx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql_group by与聚合函数order by联合使用相关的知识,希望对你有一定的参考价值。

最近测试项目数据统计模块,发现自己对group by函数以及联合使用聚合函数的使用其实根本没理解透彻。

前半部分算自己对项目遇到情况的总结,大家可忽略,直接看后半部分关于group by的使用即可!!!

前半部分:

业务逻辑背景:一个任务中,可以导入多个客户信息(包含caseId,号码、姓名等其他信息),客户信息以caseId作为唯一标识,即同一个任务中caseId不能相同,但客户手机号码可以相同。任务可配置自动重播功能(无人接听时,允许重播,重播次数可配置)

在进行呼叫次数统计时,其中一个规则是:同一个任务中,同一caseId的号码多次呼叫,呼叫次数仅计算一次

数据库:customer_profile存储客户信息;callout_session存储外呼记录相关信息,callout_task:存储任务相关信息

字段信息:

  每次电话呼叫唯一标识:session_id

  任务唯一标识:task_id

  场景模板id:dialog_template_id

  系统呼叫号码时间:callout_dial_time

求:某段时间内,某个场景模板中外呼电话总次数

错误sql语句:

select count(case_id) from
(select distinct(cp.case_id),ct.task_id,cs.session_id from callout_session cs
join callout_task ct on cs.task_id=ct.task_id
join customer_profile cp on cs.user_id = cp.user_id
where ct.dialog_template_id=\'1-1016-108\'
and callout_dial_time between \'2019-03-16 00:00:00\' and \'2019-04-02 23:59:59\'
group by case_id)A;

该sql语句为双重嵌套查询,这里仅分析内层查询,错误原因,在于group by case_id,将所有外呼记录中case_id相同的记录都合并成了一行,不符合规则“同一个任务中,同一caseId的号码多次呼叫,呼叫次数仅计算一次” 

而正确语句中group by case_id,task_id即为将同时满足case_id值相同和task_id值相同的数据合并成一行,符合规则“同一个任务中,同一caseId的号码多次呼叫,呼叫次数仅计算一次” 

正确sql语句:  

select count(session_id) from
(select ct.task_id,cs.session_id,cp.case_id from callout_session cs
join callout_task ct on cs.task_id=ct.task_id
join customer_profile cp on cs.user_id = cp.user_id
where ct.dialog_template_id=\'1-1016-108\'
and callout_dial_time between \'2019-03-16 00:00:00\' and \'2019-04-02 23:59:59\'
group by task_id,case_id)A

   

 

后半部分:

1、group by:后接字段名,根据字段对数据进行分组

SQL语句:select task_id,session_id,customer_case_id,callout_connect_status from callout_session where callout_dial_time between \'2019-04-01 00:00:000\' and \'2019-04-03 23:59:59\' group by task_id,session_id

    

        表1

1.1、单独使用group by 列名,不与聚合函数联合使用

  group by后面跟一个列名task_id,起到了去重的作用,将task_id值相同的行合并成一行显示

    

      表1.1-1

  group by后面跟两个列名task_id、customer_id:同样是去重作用,将同时满足task_id值相同、customer_id值相同的行合并成一行

    注:这里不是合并task_id值与customer_id值相同的行,博主本人以前在这里就理解错了

    

      表1.1-2

1.2、group by与聚合函数使用

sql语句:select task_id,count(task_id),session_id,customer_case_id,callout_connect_status from callout_session where callout_dial_time between \'2019-04-01 9-04-01 00:00:00\' and \'2019-04-03 23:59:59\' group by task_id order by task_id,customer_case_id;

  count(task_id) 这里统计了task_id值相同的行数量,与表1数据进行对比

    

 2、order by:对查询结果进行排序,后面跟字段名

    order by 字段名 desc:降序排列

    order by 字段名 asc:升序排列

 

以上是关于mysql_group by与聚合函数order by联合使用的主要内容,如果未能解决你的问题,请参考以下文章

聚合函数种类和功能有哪些和分组查询 group by 与 order by的区别?

聚合函数种类和功能有哪些和分组查询 group by 与 order by的区别?

oracle 之分析函数 over (partition by ...order by ...)

ORDER BY 子句中的列无效,因为它不包含在聚合函数或 GROUP BY 子句中

order_by_group_by_having的用法区别

2018-07-10聚合函数+比较条件+''和NULL+DISTINCT+ORDER BY+LIMIT+GROUP BY