繁体   English   中英

MySQL / BigQuery - 加权平均值和分组依据

[英]MySQL / BigQuery - Weighted Average & Group By

我正在尝试计算数据集的加权平均值,并在 12 个月内每月返回最大值及其相应的票证描述

我知道有很多解决类似问题的问题,但我还没有找到结合我认为需要的语法的解决方案。

下面是一些示例表数据:

月_开始_日期 优先 ticket_about_tag Phone_Time 出现次数
2019-02-01 紧急 电费单 22.42 36
2019-02-01 普通的 电费单 3.41 89
2019-05-01 普通的 Wifi 问题 45.32 12

这是我当前确定加权平均值的查询:

SELECT (Month_Begin_Date, 
(sum(phone_time * occurances))/sum(occurances)) AS Weighted_Average_Phone_Time
FROM database
GROUP BY month_begin_date

这将返回所有 ticket_about_tags 的加权平均总数,每月

但我仍然需要得到它,以便它显示按票描述分组的最大加权平均值 即看起来像这样的东西:

月_开始_日期 ticket_about_tag 加权平均通话时间
2019-01-01 电费单 22.42
2019-02-01 电费单 3.41
2019-03-01 Wifi 问题 45.32

我尝试将其作为子查询添加到另一个查询中,以便返回我之后的数据,如下所示:

SELECT Month_Begin_date, Ticket_About_Tag, Phone_Average_Handle_Time 
FROM database WHERE CONCAT(month_begin_date,phone_time) IN 
(SELECT CONCAT (Month_Begin_Date, 
(sum(phone_time * occurances))/sum(occurances)) AS Weighted_Average_Phone_Time
FROM database
GROUP BY month_begin_date
)
ORDER BY month_begin_date ASC  

非常感谢您的帮助

不确定我的问题是否正确,但使用以下数据:

月_开始_日期 优先 Ticket_About_Tag Phone_Time 出现次数
2019-02-01 紧急 电费单 22.42 36
2019-02-01 普通的 电费单 3.41 89
2019-05-01 普通的 Wifi 问题 45.32 12
2019-02-01 紧急 Wifi 问题 14.2 7
2019-02-01 普通的 Wifi 问题 30.7 5个

这是您要查询的吗?

SELECT 
Month_Begin_Date, Ticket_About_Tag,
SUM(Phone_Time * Occurences) / SUM(Occurences) AS Weighted_Average_Phone_Time
FROM `database`
GROUP BY Month_Begin_Date, Ticket_About_Tag
ORDER BY Month_Begin_Date ASC, Ticket_About_Tag ASC;

这给你的结果就像你发布的那样:

月_开始_日期 Ticket_About_Tag 加权平均电话时间
2019-02-01 电费单 8.884880083084106
2019-02-01 Wifi 问题 21.075000206629436
2019-05-01 Wifi 问题 45.31999969482422

回应您的评论

要回答您的评论,您可以:

SELECT
a.Month_Begin_Date, 
a.Ticket_About_Tag, 
b.Max_Weighted_Average_Phone_Time
FROM (

SELECT 
Month_Begin_Date,
Ticket_About_Tag,
SUM(Phone_Time * Occurences) / SUM(Occurences) AS Weighted_Average_Phone_Time
FROM `database`
GROUP BY Month_Begin_Date, Ticket_About_Tag

) a

LEFT JOIN (

SELECT
b1.Month_Begin_Date, 
MAX(b1.Weighted_Average_Phone_Time) AS Max_Weighted_Average_Phone_Time
FROM (

SELECT 
Month_Begin_Date,
Ticket_About_Tag,
SUM(Phone_Time * Occurences) / SUM(Occurences) AS Weighted_Average_Phone_Time
FROM `database`
GROUP BY Month_Begin_Date, Ticket_About_Tag

) b1

GROUP BY b1.Month_Begin_Date

) b ON a.Month_Begin_Date = b.Month_Begin_Date

WHERE a.Weighted_Average_Phone_Time = b.Max_Weighted_Average_Phone_Time

这为您提供以下 output:

月_开始_日期 Ticket_About_Tag Max_Weighted_Average_Phone_Time
2019-02-01 Wifi 问题 21.075000206629436
2019-05-01 Wifi 问题 45.31999969482422

还有其他方法可以做到这一点,但我认为这是迄今为止最容易理解的方法,无需使用其他 SQL 结构。 它反映了您对相同数据进行两次处理的需要,首先按月和工单标签聚合,然后按月查找聚合数据的最大值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM