题目:

写一个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. day08-2-Thymeleaf

    服务器渲染技术-Thymeleaf 1.基本介绍 官方在线文档:Read online 文档下载:Thymeleaf 3.1 PDF, EPUB, MOBI Thymeleaf 是什么 Thymele ...

  2. flutter版本的玩Android客户端

    flutter学习案例 目录介绍 00.项目下载与查看 01.项目介绍 02.项目优势 03.部分功能介绍 04.部分截图展示 05.版本更新 06.flutter系列博客 07.感谢 08.如何辨别 ...

  3. .Net 8.0 除gRPC之外的另一个选择,IceRPC之快束开始HelloWorld

    作者引言 很高兴啊,我们来到了第一篇,程序员的HelloWorld,快速开始RPC之游 快速入门 演示如何在几分钟内,使用IceRPC,构建和运行一个完整的客户端-服务器(C/S)应用程序. 必要条件 ...

  4. 记录--手写一个 v-tooltip 指令

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 日常开发中,我们经常遇到过tooltip这种需求.文字溢出.产品文案.描述说明等等,每次都需要写一大串代码,那么有没有一种简单的方式 ...

  5. 记录--JS原型链

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 引子 对于初学者学习原型链,还是有很大的困难.一方面是函数与对象分不太清楚:另一方面,不懂原型链的继承等.本人曾今也深受困惑,并且把疑惑的 ...

  6. verilog设计知识集合(2)

    verilog设计知识集合(2) 1.阻塞与非阻塞 阻塞赋值是存在先后关系的,非阻塞是不存在先后关系的.一般而言,阻塞用于组合逻辑,非阻塞用于时序逻辑(不一定).阻塞的执行时逐步赋值,非阻塞是同步赋值 ...

  7. 基于proteus的4026的二分频计数

    基于proteus的4026的二分频计数 1.芯片原理 4026还是一个CMOS芯片,是直接输出段码的计数器.显然,这个芯片的作用就是和七段数码管配合,直接将计数结果显示在数码管上.这里只是用于分频, ...

  8. NFNet:NF-ResNet的延伸,不用BN的4096超大batch size训练 | 21年论文

    论文认为Batch Normalization并不是网络的必要构造,反而会带来不少问题,于是开始研究Normalizer-Free网络,希望既有相当的性能也能支持大规模训练.论文提出ACG梯度裁剪方法 ...

  9. 鸿蒙HarmonyOS实战-ArkUI组件(Grid/GridItem)

    一.Grid/GridItem 1.概述 网格布局是一种新型的布局方式,它按照网格来划分页面,通过列和行来定义网格,使得页面的布局更加灵活.简洁.易于维护.网格布局能够将页面分成多个单元格,可以在这些 ...

  10. #二分图匹配#洛谷 5771 [JSOI2016]反质数序列

    题目 给出 \(n\) 个正整数,问最大的子集使得任意两个数的和都不是质数 \(n\leq 3*10^3\) 分析 如果把两个数的和为质数连边,等价于求最大独立集. 由于只有偶数加奇数才可能产生质数( ...