【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.rhkb.cn/news/379677.html

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

相关文章

【JVM基础01】——介绍-初识JVM运行流程

目录 1- 引言:初识JVM1-1 JVM是什么?(What)1-1-1 概念1-1-2 优点 1-2 为什么学习JVM?(Why) 2- 核心:JVM工作的原理(How)⭐2-1 JVM 的组成部分及工作流程2-2 学习侧重点 3- 小结(知识点大纲):3-1 JVM 组成3…

Stable Diffusion:质量高画风清新细节丰富的二次元大模型二次元插图

今天和大家分享一个基于Pony模型训练的二次元模型:二次元插图。关于该模型有4个不同的分支版本。 1.5版本:loar模型,推荐底模型niji-动漫二次元4.5。 xl版本:SDXL模型版本 mix版本:光影减弱,减少SDXL版本…

【Docker】Docker-compose 单机容器集群编排工具

目录 一.Docker-compose 概述 1.容器编排管理与传统的容器管理的区别 2.docker-compose 作用 3.docker-compose 本质 4.docker-compose 的三大概念 二.YML文件格式及编写注意事项 1.yml文件是什么 2.yml问价使用注意事项 3.yml文件的基本数据结构 三.Docker-compose …

C语言学习笔记[25]:循环语句for

for循环 for循环的基本语法 for(表达式1;表达式2;表达式3)循环语句; 表达式1为初始化部分,用于初始化循环变量的。 表达式2为条件判断部分,用于判断循环何时终止。 表达式3为调整部分,用于循环条件的调整。 例如用for循环实现打印1~10的数字…

DROO论文笔记

推荐文章DROO源码及论文学习 读论文《Deep Reinforcement Learning for Online Computation Offloading in Wireless Powered Mobile-Edge Computing Networks》的笔记 论文地址:用于无线移动边缘计算网络在线计算卸载的深度强化学习 论文代码地址:DR…

[论文笔记] CT数据配比方法论——1、Motivation

我正在写这方面的论文,感兴趣的可以和我一起讨论!!!!!! Motivation 1、探测原有模型的配比: 配比 与 ppl, loss, bpw, benchmark等指标 之间的关系。 2、效果稳定的配比:配比 与 模型效果 之间的规律。 Experiments 1、主语言(什么语言作为主语言,几种主语言?…

格式工厂转换视频分辨率

1、下载和安装 http://www.pcfreetime.com/formatfactory/CN/index.html 2、打开视频 3、设置分辨率等参数 也可以选择保持原分辨率 4、执行导出 5、打开输出所在位置

【HarmonyOS】HarmonyOS NEXT学习日记:四、布局与容器组件

【HarmonyOS】HarmonyOS NEXT学习日记:四、布局与容器组件 学习了基础组件之后,想要利用基础组件组装成一个页面,自然就要开始学习布局相关的知识。我理解的ArkUI的布局分为两个部分 一、组件自身的通用属性,诸如weight、height、…

国内新能源汽车芯片自给,承认差距,任重道远

【科技明说 | 科技热点关注】 据近日工信部电子五所元器件与材料研究院高级副院长罗道军表示,中国拥有最大的新能源车产能,芯片用量也是越来越多。但是芯片的自给率目前不到10%,是结构性的短缺。 中国拥有最大新能源车产能&#…

计算机课设——基于Java web的超市管理系统

smbms_java_web 基于Java web的超市管理系统,数据库课程设计 1.引言 是一个基于Java Web连接MySQL的小项目。 超市管理系统(smbms)作为每个计算机专业的大学生都是一个很好的练手项目,逻辑层次分明,基础功能包括用户的登录和注销&#xff…

NFS存储、API资源对象StorageClass、Ceph存储-搭建ceph集群和Ceph存储-在k8s里使用ceph(2024-07-16)

一、NFS存储 注意:在做本章节示例时,需要拿单独一台机器来部署NFS,具体步骤略。NFS作为常用的网络文件系统,在多机之间共享文件的场景下用途广泛,毕竟NFS配置方 便,而且稳定可靠。NFS同样也有一些缺点&…

S参数入门

一、说明 S参数全称为散射参数,主要用来作为描述线性无源互联结构的一种行为模型,来源于网络分析方法。网络分析法是一种频域方法,在一组离散的频率点上,通过在输入和输出端口得到的参量完全描述线性时不变系统(定义参…

[003-02-10].第10节:Docker环境下搭建Redis主从复制架构

我的博客大纲 我的后端学习大纲 我的Redis学习大纲 1.cluster(集群)模式-docker版 哈希槽分区进行亿级数据存储 1.1.面试题:1~2亿条数据需要缓存,请问如何设计这个存储案例 1.回答:单机单台100%不可能,肯…

食堂采购系统开发:从需求分析到上线实施的完整指南

本篇文章,笔者将详细介绍食堂采购系统从需求分析到上线实施的完整过程,旨在为开发团队和管理者提供一个系统化的指南。 一、需求分析 1.用户需求 常见的需求包括: -采购计划管理 -供应商管理 -库存管理 -成本控制 -报表生成 2.系统功…

STM32自己从零开始实操:PCB全过程

一、PCB总体分布 以下只能让大家看到各个模块大致分布在板子的哪一块,只能说每个人画都有自己的理由: 电源:从外部接入电源,5V接到中间,向上变成4V供给无线,向下变成3V供给下面的接口(也刻意放…

html视差滚动效果

html视差滚动效果 借助gsap效果去实现的 gsap官网 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>…

计算机网络——网络层(路由选择协议、路由器工作原理、IP多播、虚拟专用网和网络地址转换)

目录 路由选择协议 因特网的路由选择协议特点 路由信息协议RIP RIP衡量目的网络距离 RIP选择路由器的方式 RIP具有以下三个重要特点 RIP的基本工作流程 RIP的距离向量算法 ​编辑 ​编辑 RIP存在的问题——“坏消息传播得慢” RIP的封装 开放最短路径优先协议OSPF…

剖析SOLIDWORKS科研版的功能优势

在科研领域&#xff0c;高精度的建模与分析工具是科研工作者不可或缺的助手。SOLIDWORKS科研版作为一款专为科研人员和工程师设计的三维计算机辅助设计软件&#xff0c;凭借其强大的功能优势&#xff0c;在科研界获得了广泛的认可与应用。本文将从多个维度深入剖析SOLIDWORKS科…

object-C 解答算法:移动零(leetCode-283)

移动零(leetCode-283) 题目如下图:(也可以到leetCode上看完整题目,题号283) 解题思路: 本质就是把非0的元素往前移动,接下来要考虑的是怎么移动,每次移动多少? 这里需要用到双指针,i 记录每次遍历的元素值, j 记录“非0元素值”需要移动到的位置; 当所有“非0元素值”都移…

彻底改变时尚:使用 GAN 实现 AI 的未来

彻底改变时尚&#xff1a;使用 GAN 实现 AI 的未来 一、介绍 想象一下&#xff0c;在这个世界里&#xff0c;时装设计师永远不会用完新想法&#xff0c;我们穿的每一件衣服都是一件艺术品。听起来很有趣&#xff0c;对吧&#xff1f;好吧&#xff0c;我们可以在通用对抗网络 &a…