mysql_group by与聚合函数、order by联合使用
最近測(cè)試項(xiàng)目數(shù)據(jù)統(tǒng)計(jì)模塊,發(fā)現(xiàn)自己對(duì)group by函數(shù)以及聯(lián)合使用聚合函數(shù)的使用其實(shí)根本沒(méi)理解透徹。
前半部分算自己對(duì)項(xiàng)目遇到情況的總結(jié),大家可忽略,直接看后半部分關(guān)于group by的使用即可!!!
前半部分:
業(yè)務(wù)邏輯背景:一個(gè)任務(wù)中,可以導(dǎo)入多個(gè)客戶信息(包含caseId,號(hào)碼、姓名等其他信息),客戶信息以caseId作為唯一標(biāo)識(shí),即同一個(gè)任務(wù)中caseId不能相同,但客戶手機(jī)號(hào)碼可以相同。任務(wù)可配置自動(dòng)重播功能(無(wú)人接聽(tīng)時(shí),允許重播,重播次數(shù)可配置)
在進(jìn)行呼叫次數(shù)統(tǒng)計(jì)時(shí),其中一個(gè)規(guī)則是:同一個(gè)任務(wù)中,同一caseId的號(hào)碼多次呼叫,呼叫次數(shù)僅計(jì)算一次
數(shù)據(jù)庫(kù):customer_profile存儲(chǔ)客戶信息;callout_session存儲(chǔ)外呼記錄相關(guān)信息,callout_task:存儲(chǔ)任務(wù)相關(guān)信息
字段信息:
每次電話呼叫唯一標(biāo)識(shí):session_id
任務(wù)唯一標(biāo)識(shí):task_id
場(chǎng)景模板id:dialog_template_id
系統(tǒng)呼叫號(hào)碼時(shí)間:callout_dial_time
求:某段時(shí)間內(nèi),某個(gè)場(chǎng)景模板中外呼電話總次數(shù)
錯(cuò)誤sql語(yǔ)句:
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語(yǔ)句為雙重嵌套查詢,這里僅分析內(nèi)層查詢,錯(cuò)誤原因,在于group by case_id,將所有外呼記錄中case_id相同的記錄都合并成了一行,不符合規(guī)則“同一個(gè)任務(wù)中,同一caseId的號(hào)碼多次呼叫,呼叫次數(shù)僅計(jì)算一次”?
而正確語(yǔ)句中g(shù)roup by case_id,task_id即為將同時(shí)滿足case_id值相同和task_id值相同的數(shù)據(jù)合并成一行,符合規(guī)則“同一個(gè)任務(wù)中,同一caseId的號(hào)碼多次呼叫,呼叫次數(shù)僅計(jì)算一次”?
正確sql語(yǔ)句:
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:后接字段名,根據(jù)字段對(duì)數(shù)據(jù)進(jìn)行分組
SQL語(yǔ)句: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、單獨(dú)使用group by 列名,不與聚合函數(shù)聯(lián)合使用
group by后面跟一個(gè)列名task_id,起到了去重的作用,將task_id值相同的行合并成一行顯示
表1.1-1
group by后面跟兩個(gè)列名task_id、customer_id:同樣是去重作用,將同時(shí)滿足task_id值相同、customer_id值相同的行合并成一行
注:這里不是合并task_id值與customer_id值相同的行,博主本人以前在這里就理解錯(cuò)了
表1.1-2
1.2、group by與聚合函數(shù)使用
sql語(yǔ)句: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) 這里統(tǒng)計(jì)了task_id值相同的行數(shù)量,與表1數(shù)據(jù)進(jìn)行對(duì)比
?2、order by:對(duì)查詢結(jié)果進(jìn)行排序,后面跟字段名
order by 字段名 desc:降序排列
order by 字段名 asc:升序排列
來(lái)源:https://www.cnblogs.com/jingsx/p/10656748.html
總結(jié)
以上是生活随笔為你收集整理的mysql_group by与聚合函数、order by联合使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 晨起开门雪满山雪晴云淡日光寒全诗(晨起开
- 下一篇: laravel5.8笔记八:数据库(单库