力扣571(MySQL)-给定数字的频率查询中位数(困难)
题目:
Numbers 表保存数字的值及其频率。

在此表中,数字为 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 3,所以中位数是 (0 + 0) / 2 = 0。

请编写一个查询来查找所有数字的中位数并将结果命名为 median 。
解题思路:
可以借助之前力扣569-员工薪水中位数的题解思路,利用窗口函数对频率分别以正序和逆序方式求和,然后求正序和逆序大于频率总值一半的公共数值,最后对所有符合条件的num求平均值就为题目所求的中位数。
①先求出以numbers为升序和降序时的总和;
1 SELECT number,
2 SUM(frequency) over(ORDER BY number) asc_accumu,
3 SUM(frequency) over(ORDER BY number DESC) desc_accumu
4 FROM numbers;
注意:numbers这一列最后是以第二个Sum中的order by 降序排序的,我实验了如果只有第一个sum则就是升序排序。

②求所有频率的总和;
1 SELECT SUM(frequency) total
2 FROM numbers;

③加上where条件,要求正序和逆序是要大于等于总和的一半,在求出平均值即可。
1 SELECT
2 ROUND(AVG(b.number), 1 ) median
3 FROM
4 (
5 SELECT
6 number,
7 SUM( frequency ) over ( ORDER BY number ) asc_accumu,
8 SUM( frequency ) over ( ORDER BY number DESC ) desc_accumu,
9 SUM( frequency ) total
10 FROM
11 numbers a
12 ) as b
13 WHERE asc_accumu >= total/2 AND desc_accumu >= total/2;
小知识:
①中位数思路

②sum() over():
SELECT id,name,salary,
SUM(salary) over (PARTITION BY id ORDER BY name) AS a
FROM employee b;
说明:
1执行:"ORDER BY name" 按照name进行升序排序。
2执行:"sum(salary)" 对salary进行求和,
求和特点:第n行的和总是等于 第n行 + n-1行 + n-2 的和(如:第3行的和总是第3行和第1和第2行三行的和)。
力扣571(MySQL)-给定数字的频率查询中位数(困难)的更多相关文章
- 力扣——single number (只出现一次的数字) python实现
题目描述: 中文: 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 英 ...
- 力扣——single number 2(只出现一次的数字 2) python实现
题目描述: 中文: 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? ...
- 力扣Leetcode 面试题56 - I. 数组中数字出现的次数
面试题56 - I. 数组中数字出现的次数 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). 示例 ...
- JS数据结构第六篇 --- 二叉树力扣练习题
1.第226题:翻转二叉树 递归+迭代两种实现方式: /** 反转二叉树 * Definition for a binary tree node. * function TreeNode(val) { ...
- 力扣(LeetCode)删除排序链表中的重复元素II 个人题解
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 思路和上一题类似(参考 力扣(LeetCode)删除排序链表中的重复元素 个人题解)) 只不过这里需要用到一个前 ...
- C++双指针滑动和利用Vector实现无重复字符的最长子串—力扣算法
题目: 力扣原题链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/ 给定一个字符串, ...
- 力扣 ——Remove Duplicates from Sorted List II(删除排序链表中的重复元素 II)python实现
题目描述: 中文: 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 示例 1: 输入: 1->2->3->3->4->4-> ...
- 力扣—one plus(加一) python实现
题目描述: 中文: 给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一. 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字. 你可以假设除了整数 0 之外,这个整数不会以零开头 ...
- 力扣——Next Permutation(下一个排列) python实现
题目描述: 中文: 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许 ...
- 力扣Leetcode 179. 最大数 EOJ 和你在一起 字符串拼接 组成最大数
最大数 力扣 给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数. 示例 1: 输入: [10,2] 输出: 210 示例 2: 输入: [3,30,34,5,9] 输出: 9534330 说 ...
随机推荐
- 关于debian11无法安装星火商店的解决方法
#!/bin/bash if [ "$(id -u)" != "0" ] then echo "请确保你使用root权限启动此脚本" exi ...
- Android Studio自带模拟器无法访问网络问题解决
测试APP的时候,发现Android Studio自带的模拟器访问不了百度等网站,之前一直用的好好的,觉得可能是版本的问题,也有可能是公司网络的问题(因为在家里的电脑的Android Studio的模 ...
- Electron Mac 打包报 Error: Exit code: ENOENT. spawn /usr/bin/python ENOENT 解决方法
Electron 项目使用vue-cli-electron-builder创建,原来我的 Mac 上编译都很正常 自从 Mac 升级到 mac OS ventura version 13.0.1 后打 ...
- 基于C#的壁纸管理器(插件版) - 开源研究系列文章
这几天无聊,想到原来的壁纸管理器应用能够实现成插件的形式,然后思考了一下,打算把原来壁纸管理器的代码用插件形式来进行实现,于是经过几天的努力,终于完成了插件版的壁纸管理器.以前有写过C#的插件的例子( ...
- 小米Linux 运维工程师面试真题
小米Linux 运维工程师面试真题 首先我们来看下小米 Linux 运维工程师招聘岗位要求: [岗位定义]运维工程师 [岗位薪资]10K-24K [基本要求]北京 / 经验 3-5 年 / 本科及以上 ...
- 企业家智能客服知识库重磅更新,发布`v0.1.5`
FastWiki加入AIDotNet (github.com),FastWiki不再属于个人项目,目前FastWiki捐赠给了AIDotNet组织,AIDotNet拥有一下优秀项目: 项目名称 链接 ...
- C#断字符串是否为数字,用正则表达式
- 03.Java数据结构问题
目录介绍 3.0.0.1 在arrayList中System.arraycopy()和Arrays.copyOf()方法区别联系?System.arraycopy()和Arrays.copyOf()代 ...
- ts-对象数组reduce-数组转对象数组
将字符串数组转化成{name:xxx,count:xxx}[]数组的代码 #定义数据类型 interface CartInfo{ name:string, count:number } let raw ...
- 基础教材系列:Linux原理《趣谈linux》极客时间笔记
1.电脑一通电,先运行主板上ROM(只读存储器)里写死的程序BIOS,BIOS去找要运行什么操作系统,运行操作系统的第一段代码,创建0号进程,它是这次开机所有进程的爹, 2.然后操作系统代码里先初始化 ...