当前位置:   article > 正文

MYSQL练习题:员工薪水中位数

MYSQL练习题:员工薪水中位数

问题描述:

请编写SQL查询来查找每个公司的薪水中位数。
挑战点:你是否可以在不使用任何内置的SQL函数的情况下解决此问题。

-----+------------+--------+
|Id   | Company    | Salary |
+-----+------------+--------+
|1    | A          | 2341   |
|2    | A          | 341    |
|3    | A          | 15     |
|4    | A          | 15314  |
|5    | A          | 451    |
|6    | A          | 513    |
|7    | B          | 15     |
|8    | B          | 13     |
|9    | B          | 1154   |
|10   | B          | 1345   |
|11   | B          | 1221   |
|12   | B          | 234    |
|13   | C          | 2345   |
|14   | C          | 2645   |
|15   | C          | 2645   |
|16   | C          | 2652   |
|17   | C          | 65     |
+-----+------------+--------+
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

解决方案:

中位数理解:

  • 对于一个奇数长度数组中的中位数,大于这个数的数值个数等于小于这个数的数值个数。例如:【1、3、2】,中位数是2
  • 当数组长度为偶数,且元素唯一时,中位数等于排序后 中间两个数 的平均值。例如【1、2、3、4】中位数为2.5

窗口函数排序后,再where筛选

SELECT id, company, round(avg(salary),0) as Salary
FROM
(
    SELECT id, company, salary,
    ROW_NUMBER() OVER (PARTITION BY company ORDER BY Salary ASC, id ASC) AS row_num,-- 各薪水记录在其公司内的顺序编号
    COUNT(Id) OVER (PARTITION BY company) AS count_id
    FROM Employee -- 各公司的薪水记录数
) a
WHERE row_num IN (FLOOR((count_id + 1)/2), FLOOR((count_id + 2)/2))
GROUP BY id, company
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

结果:

#输出结果
+-----+------------+--------+
|Id   | Company    | Salary |
+-----+------------+--------+
|5    | A          | 451    |
|6    | A          | 513    |
|12   | B          | 234    |
|9    | B          | 1154   |
|14   | C          | 2645   |
+-----+------------+--------+
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

来源:力扣(LeetCode
链接:https://leetcode-cn.com/problems/median-employee-salary

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/423592
推荐阅读
相关标签
  

闽ICP备14008679号