Mysql满意度调查分组去除最高最低求平均分的实现思路

 更新时间:2025年01月21日 11:44:59   作者:码到三十五  
该文章介绍了如何使用SQL查询实现按部门分组,去除每个部门的最高分和最低分,并计算剩余分数的平均分,文章详细描述了实现这一需求的步骤,包括使用窗口函数、子查询和CTE等技术,感兴趣的朋友跟随小编一起看看吧

场景描述

我们有一个员工满意度调查系统,数据库中有一张表:

survey_scores 表:存储员工对公司的满意度打分。

表结构如下:

-- 调查打分表
CREATE TABLE survey_scores (
    score_id INT AUTO_INCREMENT PRIMARY KEY,
    department VARCHAR(50), -- 部门
    employee_id INT,        -- 员工ID
    score DECIMAL(5, 2)     -- 满意度打分(0-10分)
);

插入一些测试数据:

-- 插入调查打分数据
INSERT INTO survey_scores (department, employee_id, score) VALUES
('HR', 1, 8.5),
('HR', 2, 9.0),
('HR', 3, 7.0),
('HR', 4, 8.0),
('HR', 5, 9.5),
('Engineering', 6, 7.5),
('Engineering', 7, 8.0),
('Engineering', 8, 6.5),
('Engineering', 9, 9.0),
('Engineering', 10, 8.5),
('Sales', 11, 6.0),
('Sales', 12, 7.0),
('Sales', 13, 6.5),
('Sales', 14, 8.0),
('Sales', 15, 7.5);

面试题

编写一个 SQL 查询,实现以下需求:

  • 按部门(department)分组,去除每个部门的最高分和最低分。
  • 计算每个部门的平均分(去除最高分和最低分后)。
  • 返回以下字段:
    • department(部门)
    • avg_score(去除最高分和最低分后的平均分)

预期结果

上述数据,查询结果类似于:

departmentavg_score
HR8.17
Engineering8.00
Sales7.00

HR 部门

  • 原始分数:[7.0, 8.0, 8.5, 9.0, 9.5]
  • 去除最高分(9.5)和最低分(7.0)后:[8.0, 8.5, 9.0]
  • 平均分:(8.0 + 8.5 + 9.0) / 3 = 8.17

解题思路

标记每个部门的最高分和最低分

  • 使用窗口函数 ROW_NUMBER() 对每个部门的打分按升序和降序排名,标记最高分和最低分。

过滤掉每个部门的最高分和最低分

  • 使用子查询或 CTE(Common Table Expressions)过滤掉每个部门的最高分和最低分。

计算每个部门的平均分

  • 对过滤后的数据按部门分组,计算平均分。

SQL 实现

-- 第一步:标记每个部门的最高分和最低分
WITH ranked_scores AS (
    SELECT
        department,
        score,
        ROW_NUMBER() OVER (PARTITION BY department ORDER BY score ASC) AS asc_rank,
        ROW_NUMBER() OVER (PARTITION BY department ORDER BY score DESC) AS desc_rank
    FROM
        survey_scores
)
-- 第二步:过滤掉每个部门的最高分和最低分,计算平均分
SELECT
    department,
    AVG(score) AS avg_score
FROM
    ranked_scores
WHERE
    asc_rank > 1 AND desc_rank > 1 -- 去除最高分和最低分
GROUP BY
    department;

查询结果

上述数据,查询结果:

departmentavg_score
HR8.17
Engineering8.00
Sales7.00

考察点

  • 窗口函数
    • 使用 ROW_NUMBER() 对每个部门的打分进行排名。
  • 子查询和 CTE(Common Table Expressions)
    • 使用 WITH 子句将复杂查询分解为多个步骤,提高可读性。

考虑mysql5.7版本

不支持窗口函数和CTS

实现思路

  • 找到每个部门的最高分和最低分
    • 使用 GROUP BYMAX()MIN() 聚合函数找到每个部门的最高分和最低分。
  • 过滤掉每个部门的最高分和最低分
    • 使用子查询将原始数据与最高分和最低分进行比较,排除这些分数。
  • 计算每个部门的平均分
    • 对过滤后的数据按部门分组,计算平均分

到此这篇关于Mysql满意度调查分组去除最高最低求平均分的文章就介绍到这了,更多相关mysql内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • MySQL系列教程小白数据库基础

    MySQL系列教程小白数据库基础

    这篇文章主要为大家介绍了MySQL系列中的数据库基础,非常适合数据库小白的入门基础篇,详细的讲解了数据库的基本概念以及基础命令及操作示例,有需要的朋友可以借鉴参考下
    2021-10-10
  • MySQL 触发器定义与用法简单实例

    MySQL 触发器定义与用法简单实例

    这篇文章主要介绍了MySQL 触发器定义与用法,结合简单实例形式总结分析了mysql触发器的语法、原理、定义及使用方法,需要的朋友可以参考下
    2019-09-09
  • MySQL复合索引的深入探究

    MySQL复合索引的深入探究

    这篇文章主要给大家介绍了关于MySQL复合索引的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • mysql大批量插入数据的4种方法示例

    mysql大批量插入数据的4种方法示例

    这篇文章主要给大家介绍了关于mysql大批量插入数据的4种方法,文中通过示例代码介绍的非常详细,对大家学习或者使用mysql具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06
  • 如何解决mysql无法关闭的问题

    如何解决mysql无法关闭的问题

    在本篇文章里小编给大家整理的是一篇关于解决mysql无法关闭的问题的相关内容,需要的朋友们可以参考下。
    2020-08-08
  • MySQL实例crash的案例详细分析

    MySQL实例crash的案例详细分析

    这篇文章主要给大家介绍了关于MySQL实例crash的相关资料,文中通过示例代码的非常详细,对大家学习或者使用mysql具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • mysql中的四大运算符种类实例汇总(20多项) 

    mysql中的四大运算符种类实例汇总(20多项) 

    这篇文章主要介绍了mysql中的四大运算符种类汇总,运算符连接表达式中的各个操作数,他的作用是用来指明对数据表中的操作数所进行的运算
    2022-07-07
  • MySQL GROUP_CONCAT限制解决方案

    MySQL GROUP_CONCAT限制解决方案

    这篇文章主要介绍了MySQL GROUP_CONCAT限制解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
    2020-09-09
  • 关于django连接mysql数据库并进行数据库的创建的问题

    关于django连接mysql数据库并进行数据库的创建的问题

    这篇文章主要介绍了django连接mysql数据库并进行数据库的创建,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • MySQL存储过程的权限问题小结

    MySQL存储过程的权限问题小结

    这篇文章主要介绍了MySQL存储过程的权限问题小结及mysql 创建存储过程权限问题,感兴趣的朋友一起看看吧
    2018-04-04

最新评论