Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >LeetCode面试SQL-给定数字的频率查询中位数

LeetCode面试SQL-给定数字的频率查询中位数

作者头像
数据仓库晨曦
发布于 2024-10-14 07:10:41
发布于 2024-10-14 07:10:41
12500
代码可运行
举报
文章被收录于专栏:数据仓库技术数据仓库技术
运行总次数:0
代码可运行

一、题目

表: t5_numbers中保存数字的值及其频率

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+----------+-------------+
|  Number  |  Frequency  |
+----------+-------------|
|  0       |  7          |
|  1       |  1          |
|  2       |  3          |
|  3       |  1          |
+----------+-------------+

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+--------+
| median |
+--------|
| 0.0000 |
+--------+

请编写一个查询来查找所有数字的中位数并将结果命名为 median

二、分析

中位数(Median)是描述一个数据集中心位置的统计量,它是将数据集从小到大排序后位于中间位置的数值。如果数据集中的元素数量是奇数,那么中位数就是正中间的那个数;如果是偶数,中位数则是中间两个数的平均值。

本题较查询中位数更加复杂的点在给出了频次,需要将频次计算在内。相应解法:1.将所有频次生成对应的行数的数值,之后就按照正常求取中位数的方法求取即可;2.根据频次计数,基数找到对应的位置即为中位数,偶数则需要找到对应的两个位置,然后分别计算出对应的值,求取平均值。

维度

评分

题目难度

⭐️⭐️⭐️

题目清晰度

⭐️⭐️⭐️⭐️⭐️

业务常见度

⭐️⭐️⭐️

三、SQL

1.生成函数方式

该方式属于比较“笨”的方式,或者说不够取巧,但是这属于按照计算方式直接计算。小数据量直接生成,然后计算完全没问题,但是如果频次很高会导致数据量激增。

1.1 生成对应频次数据

使用lateral view、explode、space等函数原始数据炸开

执行SQL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select number, frequency
from t5_numbers
         lateral view explode(split(space(frequency - 1), ' ')) t as a

执行结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+---------+------------+
| number  | frequency  |
+---------+------------+
| 0       | 7          |
| 0       | 7          |
| 0       | 7          |
| 0       | 7          |
| 0       | 7          |
| 0       | 7          |
| 0       | 7          |
| 1       | 1          |
| 2       | 3          |
| 2       | 3          |
| 2       | 3          |
| 3       | 1          |
+---------+------------+
1.2 求取中位数

常规计算中位数方法:Hive基础知识07-求取中位数

执行SQL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select avg(number) as midian
from (select number
      from (select number, row_number() over (order by number) as rn, count(1) over () as cnt
            from t5_numbers
                     lateral view explode(split(space(frequency - 1), ' ')) t as a) t
      where t.rn in (cnt / 2, (cnt + 1) / 2, (cnt + 2) / 2)) tt

SQL结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+---------+
| midian  |
+---------+
| 0.0     |
+---------+

2.根据频次计算

由于给出了频次,频次相加得到总的数字个数,然后找到对应位置的数字,求取中位数即可。

2.1 聚合函数开窗,计算总个数及到当前数字的个数

使用sum()over()聚合函数开窗,分别计算出 total_cnt:数字总个数 order_pre_cnt:该数字开始位置(不含) order_cnt:该数字结束位置(含)

执行SQL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select
    number,frequency,
    sum(frequency)over() as total_cnt,
    nvl(sum(frequency)over(order by number rows between unbounded preceding and 1 preceding),0) as order_pre_cnt,
    sum(frequency)over(order by number) as order_cnt
from t5_numbers

SQL结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+---------+------------+------------+----------------+------------+
| number  | frequency  | total_cnt  | order_pre_cnt  | order_cnt  |
+---------+------------+------------+----------------+------------+
| 0       | 7          | 12         | 0              | 7          |
| 1       | 1          | 12         | 7              | 8          |
| 2       | 3          | 12         | 8              | 11         |
| 3       | 1          | 12         | 11             | 12         |
+---------+------------+------------+----------------+------------+
2.2判断该数字是否参与中位数计算

如果数字个数N是奇数,则中位数的位置是(N+1)/2, 如果数字个数N是偶数 则中位数是N/2和(N+2)/2位置的平均值。我们判断N是否为偶数,选取对应的位置,判断所在位置的数字是否参与计算。

执行SQL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select number,
       case
           when total_cnt % 2 = 0 then
               --偶数个计算方式
               case
                   when (total_cnt / 2 > order_pre_cnt and total_cnt / 2 <= order_cnt) or
                        ((total_cnt + 2) / 2 > order_pre_cnt and (total_cnt + 2) / 2 <= order_cnt) then 1
                   else 0 end
           else
               --奇数个计算方式
               case when
                        (total_cnt + 1) / 2 > order_pre_cnt and (total_cnt + 1) / 2 <= order_cnt then 1
                    else 0 end end as is_midian_row,
       total_cnt,
       order_pre_cnt,
       order_cnt
from (select number,
             frequency,
             sum(frequency) over ()                                                                         as total_cnt,
             nvl(sum(frequency) over (order by number rows between unbounded preceding and 1 preceding),
                 0)                                                                                         as order_pre_cnt,
             sum(frequency) over (order by number)                                                          as order_cnt
      from t5_numbers) t

SQL结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+---------+----------------+------------+----------------+------------+
| number  | is_midian_row  | total_cnt  | order_pre_cnt  | order_cnt  |
+---------+----------------+------------+----------------+------------+
| 0       | 1              | 12         | 0              | 7          |
| 1       | 0              | 12         | 7              | 8          |
| 2       | 0              | 12         | 8              | 11         |
| 3       | 0              | 12         | 11             | 12         |
+---------+----------------+------------+----------------+------------+
2.3 查询最终结果

根据上一步结果,is_midian_row = 1 代表该数字参与中位数计算,这里可能有一行或者两行是1,限定为1然后使用avg计算得到最终结果

执行SQL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select avg(number) as midian
from (select number,
             case
                 when total_cnt % 2 = 0 then
                     --偶数个计算方式
                     case
                         when (total_cnt / 2 > order_pre_cnt and total_cnt / 2 <= order_cnt) or
                              ((total_cnt + 2) / 2 > order_pre_cnt and (total_cnt + 2) / 2 <= order_cnt) then 1
                         else 0 end
                 else
                     --奇数个计算方式
                     case
                         when
                             (total_cnt + 1) / 2 > order_pre_cnt and (total_cnt + 1) / 2 <= order_cnt then 1
                         else 0 end end as is_midian_row,
             total_cnt,
             order_pre_cnt,
             order_cnt
      from (select number,
                   frequency,
                   sum(frequency) over ()                as total_cnt,
                   nvl(sum(frequency) over (order by number rows between unbounded preceding and 1 preceding),
                       0)                                as order_pre_cnt,
                   sum(frequency) over (order by number) as order_cnt
            from t5_numbers) t) tt
where tt.is_midian_row = 1

SQL结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+---------+
| midian  |
+---------+
| 0.0     |
+---------+

四、建表语句和数据插入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--建表语句
CREATE TABLE t5_numbers(
number bigint,
frequency bigint
) COMMENT '数字频次表'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
;
-- 插入数据
insert into t5_numbers(number,frequency)
values
(0,7),
(1,1),
(2,3),
(3,1);
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-10-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据仓库技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一道简单题,数组中位数差值最小
Reminder: the median of the array [a1,a2,…,a2k+1] of odd number of elements is defined as follows: let [b1,b2,…,b2k+1] be the elements of the array in the sorted order. Then median of this array is equal to bk+1. 奇数个数的数组的中位数,是数组排序后的
ACM算法日常
2020/02/25
8280
「SQL面试题库」 No_20 给定数字的频率查询中位数
「SQL面试题库」是由 不是西红柿 发起,全员免费参与的SQL学习活动。我每天发布1道SQL面试真题,从简单到困难,涵盖所有SQL知识点,我敢保证只要做完这100道题,不仅能轻松搞定面试,代码能力和工作效率也会有明显提升。
不吃西红柿
2023/03/30
4350
​LeetCode刷题实战571:给定数字的频率查询中位数
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
程序员小猿
2022/04/12
4300
​LeetCode刷题实战571:给定数字的频率查询中位数
MySQL中查询中位数?
计算中位数可能是小学的内容,然而在数据库查询中实现却并不是一件容易的事。我们今天就来看看都有哪些方法可以实现。
luanhz
2020/05/04
6.8K0
[1239]hive求解中位数
中位数(Median)又称中值,统计学中的专有名词,是按顺序排列的一组数据中居于中间位置的数,代表一个样本、种群或概率分布中的一个数值,其可将数值集合划分为相等的上下两部分。对于有限的数集,可以通过把所有观察值高低排序后找出正中间的一个作为中位数。如果观察值有偶数个,通常取最中间的两个数值的平均数作为中位数。
周小董
2023/11/26
1.5K0
[1239]hive求解中位数
LeetCode MySQL 571. 给定数字的频率查询中位数
在此表中,数字为 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 3,所以中位数是 (0 + 0) / 2 = 0。
Michael阿明
2021/02/19
7290
30道经典SQL面试题讲解(11-20)
本篇节选自书籍《对比Excel,轻松学习SQL数据分析》一书,主要讲解数据分析面试中常见的30道SQL面试题。1-10题见:30道经典SQL面试题讲解(1-10)
张俊红
2021/01/05
8240
30道经典SQL面试题讲解(11-20)
hivesql 累加计算
数据集有三列:userid,month,count,统计每个用户截止到当月为止的最大单月访问次数和累计到该月的总访问次数
用户1217611
2023/10/14
3790
MySQL查询求中位数最简单的写法
        讨论:MySQL本身没有提供中位数函数。网上有许多写法,基本是笛卡尔积与窗口函数两类,但都不是很理想。
用户1148526
2022/10/28
1.6K0
Hive基础知识07-求取中位数
中位数(Median)是描述一个数据集中心位置的统计量,它是将数据集从小到大排序后位于中间位置的数值。如果数据集中的元素数量是奇数,那么中位数就是正中间的那个数;如果是偶数,中位数则是中间两个数的平均值。
数据仓库晨曦
2024/03/06
1.3K0
Hive基础知识07-求取中位数
一文学完所有的Hive Sql(两万字最全详解)
lateral view用于和split、explode等UDTF一起使用的,能将一行数据拆分成多行数据,在此基础上可以对拆分的数据进行聚合,lateral view首先为原始表的每行调用UDTF,UDTF会把一行拆分成一行或者多行,lateral view在把结果组合,产生一个支持别名表的虚拟表。
五分钟学大数据
2021/04/02
3.2K0
【Hive】SQL语句大全
继承 org.apache.hadoop.hive.ql.udf.generic.GenericUDTF;
全栈程序员站长
2022/08/30
2.6K0
图解面试题:如何分析中位数?
学校每次考试完,都会有一个成绩表。例如,表中第1行表示编号为1的用户选择了C++岗位,该科目考了11001分。
猴子数据分析
2020/12/25
7590
Oracle DBA的SQL编写技能提升宝典(含SQL资源)
背景:要迁移数据库,需要创建与源库相同的表空间,大小与源库相同。由于个别表空间较大,手工添加可能需要写很多的脚本,于是同事通过PL/SQL解决了问题。
数据和云
2021/10/13
1.2K0
Oracle DBA的SQL编写技能提升宝典(含SQL资源)
详解spark开窗函数
窗口函数(Window functions)又称分析函数或开窗函数,它允许你在不改变原始行的情况下,对一组相关的行(称为“窗口”)进行计算和分析。与普通的聚合函数(如SUM、AVG等)不同,窗口函数不会将多行合并为一行,而是为每一行返回一个计算结果,同时保留原始行的详细信息。通常写法为func()over(),详细语法如下:
数据仓库晨曦
2025/02/26
1682
详解spark开窗函数
美团大数据面试SQL-计算用户首单是即时单的比例
在外卖订单中,有时用户会指定订单的配送时间。现定义:如果用户下单日期与期望配送日期相同则认为是即时单,如果用户下单日期与期望配送时间不同则是预约单。每个用户下单时间最早的一单为用户首单,请计算用户首单中即时单的占比。
数据仓库晨曦
2024/07/25
1770
美团大数据面试SQL-计算用户首单是即时单的比例
Hive SQL 大厂必考常用窗口函数及相关面试题
二、窗口函数的基本用法 1.基本语法 2.设置窗口的方法 1)window_name 2)partition by 子句 3) order by子句 4)rows 指定窗口大小 3.开窗函数中加order by 和 不加 order by的区别
王知无-import_bigdata
2022/11/11
3.9K0
Hive SQL 大厂必考常用窗口函数及相关面试题
【SQL 周周练】爬取短视频发现数据缺失,如何用 SQL 填充
大家好,我是“蒋点数分”,多年以来一直从事数据分析工作。从今天开始,与大家持续分享关于数据分析的学习内容。
蒋点数分
2025/05/07
1711
【SQL 周周练】爬取短视频发现数据缺失,如何用 SQL 填充
数据仓库开发 SQL 使用技巧总结
作者:dcguo 使用 sql 做数仓开发有一段时间了,现做一下梳理复盘,主要内容包括 sql 语法、特性、函数、优化、特殊业务表实现等。 mysql 数据结构 常用 innodb 存储为 B+ 树 特点 多路平衡树,m 个子树中间节点就包含 m 个元素,一个中间节点是一个 page(磁盘页) 默认 16 kb; 子节点保存了全部得元素,父节点得元素是子节点的最大或者最小元素,而且依然是有序得; 节点元素有序,叶子节点双向有序,便于排序和范围查询。 优势 平衡查找树,logn 级别 crud; 单一节点比二
腾讯技术工程官方号
2022/07/19
3.3K0
数据仓库开发 SQL 使用技巧总结
1 小时 SQL 极速入门(三)
今天我们讲一些在做报表和复杂计算时非常实用的分析函数。由于各个数据库函数的实现不太一样,本文基于 Oracle 12c 。
Lenis
2019/12/25
1K0
1 小时 SQL 极速入门(三)
推荐阅读
相关推荐
一道简单题,数组中位数差值最小
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验