目录
1. 力扣链接
2. 题目
3. 分析
4. 代码实现
5. 代码验证
6. 总结
569. 员工薪水中位数 - 力扣(LeetCode)
表:
+--------------+---------+ | Column Name | Type | +--------------+---------+ | id | int | | company | varchar | | salary | int | +--------------+---------+ id 是该表的主键列(具有唯一值的列)。 该表的每一行表示公司和一名员工的工资。编写解决方案,找出每个公司的工资中位数。
以 任意顺序 返回结果表。
查询结果格式如下所示。
示例 1:
输入: Employee 表: +----+---------+--------+ | 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 | +----+---------+--------+ 输出: +----+---------+--------+ | id | company | salary | +----+---------+--------+ | 5 | A | 451 | | 6 | A | 513 | | 12 | B | 234 | | 9 | B | 1154 | | 14 | C | 2645 | +----+---------+--------+
- 需求:找出每个公司的工资中位数。由此分析出需要根据公司进行分组,并了解中位数的定义
- 中位数定义:将数据集中的所有数值按照大小顺序排列后,位于中间位置的数值。如果数据集的个数是奇数,那么中位数就是中间的那个数;如果数据集的个数是偶数,那么中位数就是中间两个数的平均值
- 由中位数定义可以分析出需要计算每个公司的总数,以及按照工资按大小顺序排名
- 通过每个公司总数可以计算出中位数位置。总数为偶数,中位数位置是位于中间两个数值,具体位置可以通过公式 总数 / 2 和 总数 / 2 + 1 计算。总数为奇数,中位数位置就是位于中间位置的数值,具体位置可以通过公式ceil(总数 / 2)计算
- 最后通过排名对于中位数位置进行条件过滤即可
子查询:代码中首先使用了一个子查询来为每个公司的工资数据进行排序并计算总数。
窗口函数:row_number() over(partition by company order by salary) rn:这个窗口函数为每个公司的工资数据分配一个行号(rn),按照工资从低到高排序。partition by company意味着每个公司的行号是独立计算的。count(id) over(partition by company) total:这个窗口函数计算每个公司的员工总数(total),同样是按公司分区计算。
条件筛选:where rn in (total / 2, total / 2 + 1, ceil(total/2)):这个条件用于筛选出每个公司工资的中位数。如果公司员工总数是偶数,中位数将是中间两个工资的平均值,这两个工资的行号分别是total / 2和total / 2 + 1。如果员工总数是奇数,中位数将是位于中间的单个工资,其行号是ceil(total/2)。
向上取整:ceil(total/2)用于计算奇数个员工总数的中位数位置,确保得到一个整数行号。