我可以根据一个查询中其他列的值获取 mySQL 数据库中一列的平均值吗?

Can I get average of a column in mySQL DB based upon value of other column in one query?

我有一个 table 的 phone 呼叫 activity 给客户。在 table 中,我有一列用于通话时长(以秒为单位),另一列用于“首次通话”(真/假)。我希望找到一种方法来将首次呼叫的平均呼叫长度与非首次呼叫的平均时间分开?这在单个 mySQL 查询中可行吗?

SELECT location,
    count(*) AS total,
    sum(case when firstCall = 'true' then 1 else 0 end) AS firstCall,
    sum(case when answered = 'Yes' then 1 else 0 end) AS answered,
    sum(case when tags like '%Lead%' then 1 else 0 end) as lead,
    sum(case when tags like '%arbage%' then 1 else 0 end) as garbage,    
    avg(case when duration........firstTime = True???)
FROM staging
GROUP BY location
SELECT location,
count(*) AS total,
sum(case when firstCall = 'true' then 1 else 0 end) AS firstCall,
sum(case when answered = 'Yes' then 1 else 0 end) AS answered,
sum(case when tags like '%Lead%' then 1 else 0 end) as lead,
sum(case when tags like '%arbage%' then 1 else 0 end) as garbage,    
sum(case when firstCall='true' then duration else 0 end)/sum(case when firstCall =     'true' then 1 else 0 end) as first_call_true_average,
sum(case when firstCall='false' then duration else 0 end)/sum(case when firstCall  = 'false' then 1 else 0 end) as first_call_false_average

 FROM staging
 GROUP BY location

我会这样表述:

select 
    location,
    count(*) as total,
    sum(firstcall = 'true'  ) as cnt_firstcall,
    sum(answered = 'Yes'    ) as cnt_answered,
    sum(tags like '%Lead%'  ) as cnt_lead,
    sum(tags like '%arbage%') as cnt_garbage,    
    avg(case when firstcall = 'true'  then duration end) as avg_first_call,_duration
    avg(case when firstcall = 'false' then duration end) as avg_non_first_call_duration
from staging
group by location

理由:

  • MySQL 将 true/false 条件解释为数字上下文中的 1/0 值,这大大缩短了条件 sum()s

  • avg() 忽略 null 值,因此一个简单的 case 表达式足以计算条件平均值