前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySql场景面试题:满意度调查分组去除最高最低求平均分

MySql场景面试题:满意度调查分组去除最高最低求平均分

作者头像
公众号:码到三十五
发布于 2025-01-19 05:11:34
发布于 2025-01-19 05:11:34
8400
代码可运行
举报
文章被收录于专栏:设计模式设计模式
运行总次数:0
代码可运行
场景描述

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

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

表结构如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 调查打分表
CREATE TABLE survey_scores (
    score_id INT AUTO_INCREMENT PRIMARY KEY,
    department VARCHAR(50), -- 部门
    employee_id INT,        -- 员工ID
    score DECIMAL(5, 2)     -- 满意度打分(0-10分)
);

插入一些测试数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 插入调查打分数据
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 查询,实现以下需求:

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

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

department

avg_score

HR

8.17

Engineering

8.00

Sales

7.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
解题思路
  1. 标记每个部门的最高分和最低分
    • 使用窗口函数 ROW_NUMBER() 对每个部门的打分按升序和降序排名,标记最高分和最低分。
  2. 过滤掉每个部门的最高分和最低分
    • 使用子查询或 CTE(Common Table Expressions)过滤掉每个部门的最高分和最低分。
  3. 计算每个部门的平均分
    • 对过滤后的数据按部门分组,计算平均分。
SQL 实现
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 第一步:标记每个部门的最高分和最低分
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;

查询结果

上述数据,查询结果:

department

avg_score

HR

8.17

Engineering

8.00

Sales

7.00

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

不支持窗口函数和CTS

实现思路
  1. 找到每个部门的最高分和最低分
    • 使用 GROUP BYMAX()MIN() 聚合函数找到每个部门的最高分和最低分。
  2. 过滤掉每个部门的最高分和最低分
    • 使用子查询将原始数据与最高分和最低分进行比较,排除这些分数。
  3. 计算每个部门的平均分
    • 对过滤后的数据按部门分组,计算平均分。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 第一步:找到每个部门的最高分和最低分
SELECT
    s.department,
    AVG(s.score) AS avg_score
FROM
    survey_scores s
JOIN (
    SELECT
        department,
        MAX(score) AS max_score, -- 最高分
        MIN(score) AS min_score  -- 最低分
    FROM
        survey_scores
    GROUP BY
        department
) min_max_scores ON s.department = min_max_scores.department
WHERE
    s.score != min_max_scores.max_score AND s.score != min_max_scores.min_score -- 去除最高分和最低分
GROUP BY
    s.department;
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-01-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验