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 默认是不允许外放访问的,只允许 localhost 或 127.0.0.1 访问,下面这篇文章主要给大家介绍了关于Mysql开启外网访问的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • mysql查询当天的数据

    mysql查询当天的数据

    这篇文章主要介绍了mysql查询当天的数据,第一种数量小的时候用,数据量稍微起来巨慢,第二种速度快,但是最好配合复合索引来查,避免全表扫描,需要的朋友可以参考下
    2023-08-08
  • MySQL双Master配置的方法详解

    MySQL双Master配置的方法详解

    本篇文章是对MySQL双Master配置进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • 使用mysql_udf与curl库完成http_post通信模块示例

    使用mysql_udf与curl库完成http_post通信模块示例

    这篇文章主要介绍了使用mysql_udf与curl库完成http_post通信模块示例,需要的朋友可以参考下
    2014-03-03
  • MySql范围查找时索引不生效问题的原因分析

    MySql范围查找时索引不生效问题的原因分析

    这篇文章主要给大家介绍了关于MySql范围查找时索引不生效问题的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • DataGrip的MySQL数据导出和导入操作超详细指南

    DataGrip的MySQL数据导出和导入操作超详细指南

    很多时候我们会遇到需要将本机数据库数据导出或者其他数据库数据的导入操作,这篇文章主要给大家介绍了关于DataGrip的MySQL数据导出和导入操作超详细指南,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2024-04-04
  • MySql库与表的基础操作大全

    MySql库与表的基础操作大全

    本文详细讲解了MySQL数据库与表的核心操作,掌握这些基础操作后,可进一步学习MySQL的索引优化、事务管理等高级知识,提升数据库操作的效率与安全性,感兴趣的朋友跟随小编一起看看吧
    2025-10-10
  • mysql数据库的分区表示例代码

    mysql数据库的分区表示例代码

    这篇文章主要介绍了mysql数据库的分区表的相关资料,文章介绍了两种创建SQL表分区的方法,分别是手动创建和使用MySQL的定时事件来自动创建分区,手动创建分区时,需要在代码中判断分区并新增,可能会引入一些问题,需要的朋友可以参考下
    2024-11-11
  • MySQL数据库常用命令小结

    MySQL数据库常用命令小结

    这篇文章主要介绍了MySQL数据库命令,主要包括对数据库常用命令及数据库中对表的命令,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • MySQL中group by与max()一起使用的坑

    MySQL中group by与max()一起使用的坑

    最近在做一个项目,发现用之前SQL语句导出的余额与客户人员最近消费记录所显示的余额不一致,本文就来了解一下这个错误,感兴趣的可以了解一下
    2023-08-08

最新评论