如何修改SQL查询以列出任职时长超过平均水平的员工?
解决SQL查询返回空表问题:筛选任职时长超平均水平的员工
原查询返回空表的核心问题是逻辑维度不匹配:你把DATEDIFF(SYSDATE(), hire_date)计算出的任职天数(数值型),和AVG(hire_date)计算出的**雇佣日期平均值(日期/原始日期数值)**直接比较,两者完全不是同一类指标,自然不会有符合条件的结果。
正确的查询写法
方法1:子查询计算平均任职天数
SELECT first_name, last_name FROM employees WHERE DATEDIFF(SYSDATE(), hire_date) > ( -- 先计算所有员工的平均任职天数 SELECT AVG(DATEDIFF(SYSDATE(), hire_date)) FROM employees )
方法2:窗口函数方式(支持窗口函数的数据库适用,如MySQL 8.0+、PostgreSQL等)
SELECT first_name, last_name FROM ( SELECT first_name, last_name, -- 计算全局平均任职天数 AVG(DATEDIFF(SYSDATE(), hire_date)) OVER () AS avg_tenure_days, -- 计算当前员工的任职天数 DATEDIFF(SYSDATE(), hire_date) AS tenure_days FROM employees ) AS emp_tenure WHERE tenure_days > avg_tenure_days
说明
两种写法都是先计算出所有员工的平均任职天数,再将每个员工的实际任职天数与该平均值做比较,从而筛选出任职时长超过平均水平的员工。
内容的提问来源于stack exchange,提问作者Ooma
相关产品推荐
相关产品推荐

