题目:

写一个SQL查询,找出每个公司的工资中位数,以任意顺序返回结果表。查询结果个数如下所示。

输出结果如下:

 解题思路:

中位数:位于集合正中间的元素。当数据总书为奇数时,最中间的数就是中位数,当数据个数为偶数时,中间两个数的平均值为中位数。

方法一:使用窗口函数row_number() 和floor()向下取整函数

①先以公司分组按工资升序排序作为 rnk 列,以公司为组统计出公司的人数作为 cnt 列;

1 select id, company,salary,
2 row_number() over(partition by company order by salary asc) as rk,
3 count(Salary) over(partition by company) as cnt
4 from Employee;

②使用floor()函数统计出中位数id号

where t.rk in (floor((cnt+1)/2),(floor(cnt+2)/2));

假如总数为5个(1,2,3,4,5即中位数就为3)floor((5+1)/2 )= 3 ,floor((5+2)/2)=3;

假如总数为6个(1,2,3,4,5,6即中位数就为3,4)floor((6+1)/2 )= 3 ,floor((6+2)/2)=4;

③以第②步的结果为条件,进行筛选

1 select id,company,salary
2 from
3 ( select id, company,salary,
4 row_number() over(partition by company order by salary asc) as rk,
5 count(Salary) over(partition by company) as cnt
6 from Employee
7 ) t
8 where t.rk in (floor((cnt+1)/2),(floor(cnt+2)/2));

方法二:使用having()

这个有点难理解 :)

看得博客题解,但是答案有点不对,我暂时也解不出来呜呜~,看到这篇博客的朋友能不能解释一下,谢谢~

SELECT
id,
Company,
Salary
FROM
Employee
WHERE
Id IN (
SELECT
e1.Id
FROM
Employee e1
JOIN Employee e2 ON e1.Company = e2.Company
GROUP BY
e1.Id
HAVING
sum( CASE WHEN e2.Salary >= e1.Salary THEN 1 ELSE 0 END ) >= count( * ) / 2
and sum( CASE WHEN e1.Salary >= e2.Salary THEN 1 ELSE 0 END ) >= count( * ) / 2
)
GROUP BY
id,
Company,
Salary
ORDER BY
Company;

小知识:

来源《SQL进阶教程》书籍

使用HAVING 子句进行自连接:求中位数

 1 -- 求中位数的 SQL 语句 :在 HAVING 子句中使用非等值自连接
2 SELECT AVG(DISTINCT income)
3 FROM (SELECT T1.income
4 FROM Graduates T1, Graduates T2
5 GROUP BY T1.income
6 --S1 的条件
7 HAVING SUM(CASE WHEN T2.income >= T1.income THEN 1 ELSE 0 END)
8 >= COUNT(*) / 2
9 --S2 的条件
10 AND SUM(CASE WHEN T2.income <= T1.income THEN 1 ELSE 0 END)
11 >= COUNT(*) / 2 ) TMP;

注意:

其他博客的解释:博客① , 博客②

力扣569(MySQL)-员工薪水中位数(困难)的更多相关文章

  1. 力扣 -- 寻找两个有序数组的中位数 Median of Two Sorted Arrays python实现

    题目描述: 中文: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums ...

  2. 力扣---1148. 文章浏览 I

    Views 表:+---------------+---------+| Column Name   | Type    |+---------------+---------+| article_i ...

  3. 力扣---511. 游戏玩法分析 I

    活动表 Activity: +--------------+---------+| Column Name  | Type    |+--------------+---------+| player ...

  4. 力扣算法题—069x的平方根

    实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例 1: 输入: 4 输出: 2 示例 ...

  5. SQL-12 获取所有部门中当前员工薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary

    题目描述 获取所有部门中当前员工薪水最高的相关信息,给出dept_no, emp_no以及其对应的salaryCREATE TABLE `dept_emp` (`emp_no` int(11) NOT ...

  6. JS数据结构第六篇 --- 二叉树力扣练习题

    1.第226题:翻转二叉树 递归+迭代两种实现方式: /** 反转二叉树 * Definition for a binary tree node. * function TreeNode(val) { ...

  7. 力扣(LeetCode)删除排序链表中的重复元素II 个人题解

    给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 思路和上一题类似(参考 力扣(LeetCode)删除排序链表中的重复元素 个人题解)) 只不过这里需要用到一个前 ...

  8. C++双指针滑动和利用Vector实现无重复字符的最长子串—力扣算法

    题目: 力扣原题链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/ 给定一个字符串, ...

  9. LeetCode 1244. 力扣排行榜

    地址 https://www.acwing.com/solution/LeetCode/content/5765/ 题目描述新一轮的「力扣杯」编程大赛即将启动,为了动态显示参赛者的得分数据,需要设计一 ...

  10. 力扣50题 Pow(x,n)

    本题是力扣网第50题. 实现 pow(x, n) ,即计算 x 的 n 次幂函数. 采用递归和非递归思路python实现. class Solution: #递归思路 def myPow_recurs ...

随机推荐

  1. vscode sftp 代码同步到服务器

    然后执行 ctrl+shift+p ,搜索 SFTP:Config 回车后,会生成一个".vscode/sftp.json",这个就是配置文件 参考:VsCode SFTP插件详细 ...

  2. 软件推荐: Sourcetree git软件

    注意事项: 破解的时候,json文件目录不是软件exe所在目录,是数据目录 %LocalAppData%\Atlassian\SourceTree 还有就是第一次运行弹出个 有个插件要不要用,选第3个 ...

  3. idea的安装和无限期试用

    十年前在笔者开发的时候一直使用的是eclipse软件,但后来所有的发现公司基本用的是idea,还得重新学习idea用法,所以准备在去新公司前,来学习使用idea吧 第一步:安装idea https:/ ...

  4. 安装swagger过程及遇到问题

    参考:欢迎点击原文:https://www.cnblogs.com/liconglong/p/11477401.html(主要) https://blog.csdn.net/liangjiabao55 ...

  5. JAVAoooooo

    class Grandparent { public Grandparent() { System.out.println("GrandParent Created."); } p ...

  6. 记录--微信调用jssdk全流程详解

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 微信调用jssdk全流程详解 系统框架使用的是前后端分离,前端使用vant,后端是springboot 一.网页授权的时序图 二.公众号配 ...

  7. module 'numpy' has no attribute 'bool'

    module 'numpy' has no attribute 'bool' 问题: Traceback (most recent call last): File "/home/test. ...

  8. Python爬虫爬取搜狐视频电影并存储到mysql数据库

    数据获取方式:微信搜索关注[靠谱杨阅读人生]回复[电影].整理不易,资源付费,谢谢支持. 代码: 1 import time 2 import traceback 3 import requests ...

  9. SQL 递归核心思想(递归思维)

    目前很缺递归思维,主要是算法代码写得少,本篇记录下以 PostgreSQL 代码举例(主要是非常喜欢这款性能小钢炮数据库). 树状查询不多说,很简单大家基本都会,主要讲 cte 代码递归实现不同需求. ...

  10. #模型转换#洛谷 6075 [JSOI2015]子集选取

    题目 分析 \(n\)个元素可以独立操作,考虑单个元素, 则选不选择一定有一道分界线, 而这条分界线正好要走\(k\)次, 每次可以选择向上走或向右走,所以为\(2^k\), 由于\(n\)个元素相互 ...