Leetcode_569.员工薪水中位数

题目难度

困难

正确答案

SELECT E1.Id,E1.Company,E1.Salary
FROM Employee E1
LEFT JOIN Employee E2
ON E1.Company=E2.Company
GROUP BY E1.Company,E1.Salary
HAVING SUM(    
	CASE    
	WHEN E1.Salary = E2.Salary THEN 1 ELSE 0    
	END    ) # 我出现的次数
	>=  ABS(SUM(SIGN(E1.Salary-E2.Salary))) #比我大的数字与比我小的数字个数之差
ORDER BY E1.Id;

中位数:
在奇数的数列中

  • 如果我是中位数,
    • 如果我只出现1次,比我大的数字个数与比我小的数字个数之间相差0,
    • 如果我出现n次,比我大的数字个数与比我小的数字个数之间相差n-1;
  • 如果我不是中位数
    • 如果我只出现1次,比我大的数字个数与比我小的数字个数之间相差至少2,
    • 如果我出现n次,比我大的数字个数与比我小的数字个数之间相差至少n+1;

在偶数数列中

  • 如果我是中位数,
    • 如果我只出现1次,比我大的数字个数与比我小的数字个数之间相差1,
    • 如果我出现n次,比我大的数字个数与比我小的数字个数之间相差相差n;
  • 如果我不是中位数,
    • 如果我只出现1次,比我大的数字个数与比我小的数字个数之间相差至少3,
    • 如果我出现n次,比我大的数字个数与比我小的数字个数之间相差至少n+2;

综上: 无论是奇数还是偶数数列,都要统计两个指标:

  1. 我出现了几次
  2. 比我大的数字与比我小的数字个数之差
  • 什么情况下是中位数?
    我出现的次数 >= 比我大的数字与比我小的数字个数之差

函数

  • ABS 绝对值
  • SIGN 大于0的数返回1,小于0的数返回-1,0返回0

你可能感兴趣的:(Leetcode_569.员工薪水中位数)