【Hive SQL 每日一题】找出各个商品销售额的中位数

文章目录

    • 测试数据
    • 需求说明
    • 需求实现
      • 方法1 —— 升序计算法
      • 方法2 —— 正反排序法
    • 补充

测试数据

-- 创建 orders 表
DROP TABLE IF EXISTS orders;
CREATE TABLE orders (order_id INT,product_id INT,order_date STRING,amount DOUBLE
);-- 插入 orders 数据
INSERT INTO orders VALUES
(1, 1, '2024-01-01', 100.0),
(2, 1, '2024-01-02', 150.0),
(3, 2, '2024-01-03', 200.0),
(4, 3, '2024-01-04', 50.0),
(5, 4, '2024-01-05', 300.0),
(6, 5, '2024-01-06', 250.0),
(7, 1, '2024-01-07', 80.0),
(8, 2, '2024-01-08', 220.0),
(9, 3, '2024-01-09', 60.0),
(10, 4, '2024-01-10', 310.0),
(11, 5, '2024-01-11', 230.0),
(12, 1, '2024-01-12', 90.0),
(13, 2, '2024-01-13', 210.0),
(14, 3, '2024-01-14', 70.0),
(15, 4, '2024-01-15', 320.0),
(16, 5, '2024-01-16', 240.0),
(17, 1, '2024-01-17', 110.0),
(18, 2, '2024-01-18', 190.0),
(19, 3, '2024-01-19', 80.0),
(20, 4, '2024-01-20', 330.0),
(21, 5, '2024-01-21', 260.0),
(22, 1, '2024-01-22', 120.0),
(23, 2, '2024-01-23', 230.0),
(24, 3, '2024-01-24', 90.0),
(25, 4, '2024-01-25', 340.0),
(26, 5, '2024-01-26', 270.0),
(27, 1, '2024-01-27', 130.0),
(28, 2, '2024-01-28', 180.0),
(29, 3, '2024-01-29', 100.0),
(30, 4, '2024-01-30', 350.0);

需求说明

求出每个商品的订单金额中位数。

结果示例:

product_idmedian
1110.0
2200.0
2210.0

结果按 product_id median 升序排列。

其中:

  • product_id 表示商品 ID;
  • median 表示该商品的中位数值。

需求实现

需求实现之前,我们需要明确中位数的概念,在日常生活中,我们是如何计算中位数的?

这里给定一个列表 [4,5,6,7,8],请你计算该列表的中位数,那么该如何进行呢?

首先,求中位数需要将数值按照从小到大的顺序排列,然后根据中位数列表的长度 n 不同有两种结果:

  • 如果列表长度 n 为偶数,那么中位数就有两个,为第 n/2 个和第 n/2+1 个;

  • 如果列表长度 n 为奇数,那么中位数就只有一个,为第 (n+1)/2 个。

这里给定的示例列表长度为 5,是一个奇数,故它的中位数为第 (5+1)/2 个,所以这个列表的中位数为 6

那么,学会了如何计算中位数,下面就说说如何在 SQL 中实现。

方法1 —— 升序计算法

selectproduct_id,amount median
from(selectproduct_id,amount,row_number() over(partition by product_id order by amount) rn,count(1) over(partition by product_id) cntfromorders)t1
wherern in (cnt/2,cnt/2+1,(cnt+1)/2)
order byproduct_id,median;

输出结果如下所示:

在这里插入图片描述

这个方法就是上面提到的中位数计算逻辑:

  • 分组按从小到大进行排名;

  • 分组统计总个数;

  • 判断排名是否处于中位数的结果中。

方法2 —— 正反排序法

selectproduct_id,amount median
from(selectproduct_id,amount,row_number() over(partition by product_id order by amount) rn_asc,row_number() over(partition by product_id order by amount desc) rn_desc,count(1) over(partition by product_id) cntfromorders)t1
wherern_asc >= cnt/2andrn_desc >= cnt/2
order byproduct_id,median;

输出结果如下:

在这里插入图片描述

这个方法的计算逻辑有所不同:

  • 分组按从小到大进行排名;

  • 分组按从大到小进行排名;

  • 分组统计总个数 cnt

  • 判断正反排名是否都满足 cnt/2

那么为什么这种方法可以取到中位数呢?我们一起来看看子查询 t1 的结果:

在这里插入图片描述

t1 子查询中可以看到,如果总个数为奇数时,那么该组中的中位数有且仅有一个,因为它无论时正序还是逆序排列,中位数的排名都不会发生改变,这种情况时,那么是不是满足条件 rn_asc = rn_desc 我们就能够找出长度为奇数组中的中位数。

如果总个数为偶数时,根据中位数的特性,该组的中位数一定是两个,那么如何设置条件呢?其实我们可以从正反序的排名中入手,同组中,当满足 rn_asc >= cnt/2rn_desc >= cnt/2 条件时,它就能够找出长度为偶数中的中位数。

将奇偶条件结合,可以省略直接写成 rn_asc >= cnt/2 and rn_desc >= cnt/2

补充

在 Hive 中有两个内置的聚合函数可以用于求近似中位数,分别是:

  • percentile(col,0.5)

  • percentile_approx(col,0.5)

其中第一个参数 col 为我们要求中位数的列,第二个参数固定为 0.5

它们的区别是,percentile 中指定的列必须是整型,不能是浮点型。如果是浮点型数据,则使用 percentile_approx 函数,它们在用法上并没有差别。

注意: 这两个函数无法严格的计算出中位数,它们计算的只是一个近似值,意味着和真正的中位数是存在一定差异的,特别是在数据量较少或数据分布不均的情况下。

如果不需要拿到准确的中位数值,只需要获取到这组数据中相对的中位数,那么则可以使用这两个内置函数,主要看业务指标口径是否需要达到精准。

使用示例

DROP TABLE IF EXISTS orders;
CREATE TABLE orders (order_id INT,product_id INT,amount DOUBLE
);INSERT INTO orders (order_id, product_id, amount) VALUES
(1, 1, 100.0),
(2, 1, 150.0),
(3, 1, 666.6),
(4, 3, 180.0),
(5, 3, 250.0),
(6, 3, 320.0);selectproduct_id,percentile_approx(amount,0.5) median
fromorders
group byproduct_id;

输出结果如下:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/872117.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件工程课设——成绩管理系统

软件工程课设——成绩管理系统 该文档是软件工程课程设计,成绩管理子系统的开发模块仓库。 功能分析 从面向的用户分,成绩管理子系统主要面向三类用户,即至少需要满足这三类用户的需求: 学生:学生是成绩管理系统的…

深入理解 Git Reset 的三种模式及其使用场景

🍎个人博客:个人主页 🏆个人专栏:Android ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 1. --soft 模式 2. --mixed 模式(默认) 3. --hard 模式 总结 结语 我的其他博客 前言 在日常的开发…

机器学习-1:人工智能、机器学习和深度学习的关系

人工智能(AI) 简单理解,任何一种事物只要具备了一定的智能就可以把它归类为人工智能。 官方定义:"AI is the field that sdudies the synthesis and analysis of computational agents that act intelligently." 其中&a…

安卓学习中遇到的问题【bug】

安卓学习中遇到的问题 1Gradle下载慢怎么办? Gradle下载慢怎么办? distributionUrlhttps://mirrors.cloud.tencent.com/gradle/gradle-7.5-bin.zip 2 Could not resolve all files for configuration ‘:classpath‘. > Could not resolv…

uniapp-vue3-vite 搭建小程序、H5 项目模板

uniapp-vue3-vite 搭建小程序、H5 项目模板 特色准备拉取默认UniApp模板安装依赖启动项目测试结果 配置自动化导入安装依赖在vite.config.js中配置 引入 prerttier eslint stylelint.editorconfig.prettierrc.cjs.eslintrc.cjs.stylelintrc.cjs 引入 husky lint-staged com…

处理在 electron 中使用开启了懒加载的 el-image 后,窗口最大化或窗口尺寸变化后图片无法显示的问题

文章目录 1、问题描述2、详情动图3、解决思路4、解决方案5、效果展示 1、问题描述 在 electron 中使用 el-image 时,开启了懒加载后,发现只有当窗口滚动后,图片才会显示,即便图片已经处于窗口的可视区域。当拖动窗口使其尺寸变大…

基于JAVA+SpringBoot+Vue+uniapp+协同过滤算法+爬虫+AI的减肥小程序

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 小程序用户登录&#…

前端开发体系+html文件详解

目录 html骨架 body主体内基本元素 基本元素 超文本(超链接跳转) 锚点 图片标签 列表标签 表格标签 框架标签(窗口标签) 音频标签 视频标签 VScode编译器 输入框 字体样式 实例展示: 首先简要介绍前端的整…

在VS2017下FFmpeg+SDL编写最简单的视频播放器

1.下载ShiftMediaProject/FFmpeg 2.下载SDL2 3.新建VC控制台应用 3.配置include和lib 4.把FFmpeg和SDL的dll 复制到工程Debug目录下,并设置调试命令 5.复制一下mp4视频到工程Debug目录下(复制一份到*.vcxproj同一目录,用于调试) 6…

python中的re模块--正则表达式

正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科 学的一个概念。正则表达式通常被用来检索、替换那些符合某个模 式(规则)的文本 re模块作用 通过使用…

JVM 内存介绍

本文主要介绍: JVM 内存分哪几个区,每个区的作用是什么 备注: 橙色:堆 和 方法区 ,属于jvm公有部分,可以进行调优 灰色:java栈,本地方法栈和计数器 属于jvm的私有部分,不可进行调优 一个对象从创建到被回收的过程是怎样的? Personpnew Perso…

【HarmonyOS】HarmonyOS NEXT学习日记:一、创建和运行一个页面

【HarmonyOS】HarmonyOS NEXT学习日记:一 DevEco Studio下载与安装 直接到官网的下载地址下载即可 正常下载、解压、安装完成后 正常来说不会有项目,并且是英文界面。 需要汉化的话可以按照下面的步骤设置插件 选择customize里的 all setting 进入…

macOS Sequoia 15(Macos15系统)v15.0 Beta 3发布 macOS Sequoia 15 功能预览

macOS Sequoia 15 功能预览 犀利一如 Mac macOS Sequoia 15(Macos15系统)v15.0 Beta 3测试版本下载安装 连续互通 你的 Mac 上,iPhone 用起来。 有了 iPhone 镜像功能,在 Mac 上就能看到 iPhone 屏幕画面,还能直接进行操控,不拿…

uniapp 实现上传文件的功能

上传单个文件 <script setup>const handleUploadClick () > {console.log("上传文件")uni.chooseImage({success: (chooseImageRes) > {const tempFilePaths chooseImageRes.tempFilePaths;console.log("用户选择的图片&#xff1a;", temp…

誉天教育与武汉晴川学院携手开展鸿蒙实训营,共筑鸿蒙生态新篇章!

在数字经济蓬勃发展的今天&#xff0c;鸿蒙系统作为华为自主研发的操作系统&#xff0c;正逐步构建起一个开放、协同、共赢的生态体系。为了进一步推动鸿蒙生态的繁荣发展&#xff0c;培养更多具备鸿蒙原生应用开发能力的专业人才&#xff0c;誉天教育与武汉晴川学院强强联合&a…

十九、【文本编辑器(五)】排版功能

目录 一、搭建框架 二、实现段落对齐 三、实现文本排序 一、搭建框架 (1) 在imgprocessor.h文件中添加private变量&#xff1a; QLabel *listLabel; //排序设置项QComboBox *listComboBox;QActionGroup *actGrp;QAction *leftAction;QAction *…

C#知识|SqlParameterCollection 只接受非空的 SqlParameter 类型对象,不接受 SqlParameter[] 对象

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 今天在练习C#时遇到报错&#xff1a; SqlParameterCollection 只接受非空的 SqlParameter 类型对象&#xff0c;不接受 SqlParameter[] 对象。 01 为什么使用SqlParameter 开发中之所以采用SqlParameter[]param是因为…

weblogic中间件运维常见问题

背景&#xff1a; 工作需要经常使用到weblogic中间件产品&#xff0c;在维护过程中有遇见的一些常见故障问题&#xff0c;这里分享给大家。 问题一&#xff1a;密码文件报错 问题描述&#xff1a; weblogic应用在启动过程中出现如下的报错内容&#xff1a; # tail -f nohup.ou…

五、 计算机网络(考点篇)试题

A、B、C都没问题&#xff0c;选D。现在基本上所有的互联网网站都是https了&#xff0c;电子支付类的更不用说了。 简单邮件传输的协议是SMTP(发)和POP3(收)&#xff0c;分别是25和110。选B和B 网络分片技术&#xff0c;分割切片嘛。 选C&#xff0c;AES加密等级比较高了&#x…

MFC程序创建word,创建表格,写入数据

文章目录 1、MFC程序功能&#xff1a;2、MFC程序实现2.1 创建项目2.2 添加word操作类2.3 添加word资源2.4 编写代码&#xff0c;实现将数据写入到word2.5 运行程序、验证功能3、工程代码下载 1、MFC程序功能&#xff1a; 创建word文档&#xff1b;向文档中写入字符串&#xff…