我想知道为什么红色下划线的这条线不是
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 中,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;
此查询计算每一行和前两行的平均工资,按雇用日期排序。
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 下是不允许的)。