Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > mysql求平均分

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

作者:码到三十五

该文章介绍了如何使用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 查询,实现以下需求:

预期结果

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

departmentavg_score
HR8.17
Engineering8.00
Sales7.00

HR 部门

解题思路

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

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

计算每个部门的平均分

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

考察点

考虑mysql5.7版本

不支持窗口函数和CTS

实现思路

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

您可能感兴趣的文章:
阅读全文