569. 员工薪水中位数

it2023-04-01  73

Employee 表包含所有员工。Employee 表有三列:员工Id,公司名和薪水。

IdCompanySalary1A23412A3413A154A153145A4516A5137B158B139B115410B134511B122112B13413C134514C264515C264516C265217C65

请编写SQL查询来查找每个公司的薪水中位数。

挑战点:你是否可以在不使用任何内置的SQL函数的情况下解决此问题。

IdCompanySalary15A4516A51312B2349B115414C2645

题目条件

# NySQL DROP TABLE IF EXISTS `employee`; CREATE TABLE `employee` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `Company` varchar(20) COLLATE utf8_bin DEFAULT NULL, `Salary` int(20) DEFAULT NULL, KEY `Id` (`Id`) ) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8 COLLATE=utf8_bin; /*Data for the table `employee` */ insert into `employee`(`Id`,`Company`,`Salary`) values (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);

使用 ROW_NUMBER ()函数 和 FLOOR()函数

算法

第一步:

创建两个新的column:一个在每个company中排序,产生row number; 另一个column是count这个company有多少员工。

# MySQL 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`;

结果 第二步:

使用FLOOR()函数计算row_number = 中位数。

# MySQL SELECT e.`Id`,e.`Company`,e.`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` ) AS e WHERE e.row_num IN (FLOOR((e.count_id + 1)/2), FLOOR((e.count_id + 2)/2));

结果

来源:力扣(LeetCode)

上一题:部门工资前三高的所有员工

最新回复(0)