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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值