[英]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.