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

迈不过友情╰ 2024-04-18 17:51 134阅读 0赞

最近测试项目数据统计模块,发现自己对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

    format_png

        表1

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

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

    format_png 1

      表1.1-1

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

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

    format_png 2

      表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数据进行对比

    format_png 3

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

    order by 字段名 desc:降序排列

    order by 字段名 asc:升序排列

来源:https://www.cnblogs.com/jingsx/p/10656748.html

发表评论

表情:
评论列表 (有 0 条评论,134人围观)

还没有评论,来说两句吧...

相关阅读

    相关 mysql group by order by

    这两天让一个数据查询难了。主要是对group by 理解的不够深入。才出现这样的情况 这种需求,我想很多人都遇到过。下面是我模拟我的内容表 复制代码 代码如下:

    相关 order by索引

    ORDER BY 通常会有两种实现方法,一个是利用有序索引自动实现,也就是说利用有序索引的有序性就不再另做排序操作了。另一个是把结果选好之后再排序。 用有序索引这种,当然是最