MySQL:AVG() 与 AVG() OVER()

问题描述 投票:0回答:2

我想知道为什么红色下划线的这条线不是

AVG(tenure) OVER() AS avg_tenure
?输出表如下所示是正确的,但不确定我们什么时候应该正常使用 AVG() 还是 AVG() OVER() 作为窗口函数?

SELECT gender, Churn,
COUNT(*) as count_by_category,
COUNT(*)/SUM(COUNT(*)) OVER () AS pct_of_total,
AVG(tenure) AS avg_tenure
FROM churn.telco
GROUP BY gender, Churn;

mysql sql average window-functions
2个回答
1
投票

在 MySQL 中,AVG() 和 AVG() OVER() 都是可用于计算查询中列或表达式的平均值的函数。但是,它们用于不同的上下文并且具有不同的语法和行为。

AVG() 是一个聚合函数,与 GROUP BY 子句一起使用来计算每组行的列的平均值。例如:

SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department;

此查询计算员工表中每个部门的平均工资。

AVG() OVER() 是一个窗口函数,用于计算指定行窗口中列的平均值,而不对它们进行分组。例如:

SELECT name, salary, AVG(salary) OVER () AS avg_salary
FROM employees;

此查询计算 employees 表中所有行的平均工资,并将其作为新列添加到结果集中。未指定窗口框架,因此使用整个结果集。

AVG()和AVG() OVER()的主要区别是前者需要GROUP BY子句,每组返回一行,而后者不需要分组,返回与输入表相同的行数,还有一个用于计算平均值的附加列。

注意 AVG() OVER() 也可以与窗口框架规范一起使用,以计算特定行范围内的平均值,例如最后三行。例如:

SELECT name, salary, AVG(salary) OVER (ORDER BY hire_date ROWS 2 PRECEDING) AS avg_salary_last_three
FROM employees;

此查询计算每一行和前两行的平均工资,按雇用日期排序。


0
投票

AVG OVER 和 AVG 做了非常不同的事情。

在这里,您按性别和流失率分组; plain

AVG(tenure)
从具有相同性别和流失的所有源行返回平均任期。

另一方面,

AVG(tenure) OVER ()
返回选择返回的所有
result
行的 tenure 的平均值。因为如果你要这样做
select tenure from ... group by gender, Churn
它会从每个性别的行之一返回任意任期,Churn,取平均值是没有用的(实际上在推荐的 ONLY_FULL_GROUP_BY sql_mode 下是不允许的)。

© www.soinside.com 2019 - 2024. All rights reserved.