有11家门店数据,要求每天所有门店的各个指标的中位数

1.第一种做法,使用PERCENTILE_CONT() 函数 SQL SERVER 2012 版本及以上

PERCENTILE_CONT 函数简介

PERCENTILE_CONT 是 SQL 中的窗口函数,用于计算连续百分位数(基于线性插值)。适用于需要获取数据分布中特定百分位值的场景,如统计工资的中位数或 90% 分位数。

语法结构

PERCENTILE_CONT(percentile) WITHIN GROUP (ORDER BY sort_expression)
OVER ([PARTITION BY partition_expression])

  • percentile:介于 0 和 1 之间的数值,指定所需的百分位(如 0.5 表示中位数)。
  • sort_expression:用于排序的列或表达式。
  • PARTITION BY:可选,按指定列分组计算百分位数。

基础用法示例

计算整个表中工资列的中位数(50% 分位数):

SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY salary) AS median_salary
FROM employees;

分组计算示例

按部门分组计算工资的 75% 分位数:

SELECT department_id,PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY salary) AS percentile_75
FROM employees
GROUP BY department_id;

窗口函数用法

结合 OVER 和 PARTITION BY 计算每个部门的工资中位数:

SELECT employee_id,department_id,salary,PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY salary) OVER (PARTITION BY department_id) AS dept_median_salary
FROM employees;

多百分位计算

单次查询中计算多个百分位值:

SELECT PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY salary) AS percentile_25,PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY salary) AS percentile_50,PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY salary) AS percentile_75
FROM employees;

注意事项

  1. PERCENTILE_CONT 在 Oracle、PostgreSQL 和 SQL Server 中支持,但 MySQL 需使用 PERCENTILE_CONT 的替代方案。
  2. 结果为浮点数,即使输入是整数类型。
  3. 空值(NULL)会被自动忽略。
  4. 与 PERCENTILE_DISC 的区别:PERCENTILE_CONT 返回插值结果,PERCENTILE_DISC 返回实际存在的值。

解决代码:

WITH test_basedata AS (-- 模拟11家门店的指标数据(sdate统一为20250814,覆盖不同指标值,方便验证中位数)SELECT '20250814' AS sdate, 'SH001' AS shopid, 0.25 AS profit_rate, 89.5 AS avg_customer_price, 2.1 AS avg_num_purchases, 0.85 AS salevalue_finishrate, 0.12 AS abysku_rate, 35 AS dsiUNION ALL SELECT '20250814', 'SH002', 0.32, 105.2, 1.8, 1.02, 0.08, 28UNION ALL SELECT '20250814', 'SH003', 0.18, 76.9, 2.5, 0.68, 0.15, 42UNION ALL SELECT '20250814', 'SH004', 0.41, 120.7, 1.5, 1.25, 0.05, 22UNION ALL SELECT '20250814', 'SH005', 0.29, 98.3, 2.3, 0.95, 0.10, 30UNION ALL SELECT '20250814', 'SH006', 0.35, 112.1, 1.9, 1.10, 0.07, 25UNION ALL SELECT '20250814', 'SH007', 0.22, 82.4, 2.4, 0.75, 0.13, 38UNION ALL SELECT '20250814', 'SH008', 0.38, 109.6, 1.7, 1.08, 0.06, 26UNION ALL SELECT '20250814', 'SH009', 0.27, 92.8, 2.2, 0.88, 0.11, 33UNION ALL SELECT '20250814', 'SH010', 0.31, 10.5, 2.0, 0.99, 0.09, 29UNION ALL SELECT '20250814', 'SH011', 0.42, 10.5, 2.0, 0.99, 0.09, 29
),
daily_medians AS (SELECTdistinct sdate,-- 计算中位数PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY profit_rate) OVER(PARTITION BY sdate) AS median_profit_rate,PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY avg_customer_price) OVER(PARTITION BY sdate) AS median_avg_customer_price,PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY avg_num_purchases) OVER(PARTITION BY sdate) AS median_avg_num_purchases,PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY salevalue_finishrate) OVER(PARTITION BY sdate) AS median_salevalue_finishrate,PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY abysku_rate) OVER(PARTITION BY sdate) AS median_abysku_rate,PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY dsi) OVER(PARTITION BY sdate) AS median_dsiFROM test_basedata -- GROUP BY sdate,profit_rate,avg_customer_price,avg_num_purchases,salevalue_finishrate,abysku_rate,dsi
)
SELECT * FROM daily_medians;

2.第二种做法,通用版本

解决代码:

1.首先利用窗口函数,求出总行数以及每个指标的排序

2.再利用ceiling 向上取整函数,和floor 向下取整函数 去求中位数的位置,并且返回对应的中位数数值

3.最后两数加和,取平均值

代码功能说明

这段SQL代码用于计算多个门店在不同业务指标上的中位数值。通过创建临时测试数据表test_basedata,模拟了11家门店在利润、客单价、购买次数等指标上的数据,并采用窗口函数等方法计算各指标的中位数。

数据结构说明

临时表test_basedata包含以下字段:

  • sdate:日期标识(固定为20250814)
  • shopid:门店编号
  • profit_rate:利润率
  • avg_customer_price:客单价
  • avg_num_purchases:平均购买次数
  • salevalue_finishrate:销售目标完成率
  • abysku_rate:缺货率
  • dsi:库存周转天数

核心计算逻辑

中位数计算原理: 当数据量为奇数时取中间值,偶数时取中间两个值的平均数。代码通过CEILINGFLOOR函数分别定位中间位置的上下界。

计算过程分解

  1. 内层查询使用ROW_NUMBER()为每个指标按值排序并标记排名
  2. 中间层查询通过MAX(CASE WHEN...)提取中间位置对应的指标值
  3. 外层查询对偶数的中间位置取平均值得到最终中位数

关键函数说明

  • ROW_NUMBER() OVER (PARTITION BY...ORDER BY...)
    窗口函数,对分组后的数据按指定字段排序并生成序号

  • CEILING(total_count/2.0)
    向上取整,用于定位中位数上界位置(如10个值时返回5,11返回6(5.5向上取整为6))

  • FLOOR(total_count/2.0)+1
    向下取整后+1,用于定位中位数下界位置(如10个值时返回6,11返回6(5.5向下取整为5,5+1=6))

  • COUNT(*) OVER (PARTITION BY sdate)
    计算每个日期的总记录数,用于判断奇偶性

结果输出说明

最终输出包含:

  • 原始日期字段sdate
  • median_profit_rate:利润率中位数
  • median_avg_customer_price:客单价中位数
  • median_avg_num_purchases:平均购买次数中位数
  • median_salevalue_finishrate:销售完成率中位数
  • median_abysku_rate:缺货率中位数
  • median_dsi:库存周转天数中位数

特殊处理说明

对于偶数个数据点(如示例中的11条记录):

  • 利润率中位数 = (第6名的值 + 第6名的值)/2
  • 实际会取相同值,等同于直接取第6名的值

对于奇数个数据点(如10条记录):

  • 会正确计算第5名和第6名指标值的平均数

解决代码:


WITH test_basedata AS (-- 模拟10家门店的指标数据(sdate统一为20250814,覆盖不同指标值,方便验证中位数)SELECT '20250814' AS sdate, 'SH001' AS shopid, 0.25 AS profit_rate, 89.5 AS avg_customer_price, 2.1 AS avg_num_purchases, 0.85 AS salevalue_finishrate, 0.12 AS abysku_rate, 35 AS dsiUNION ALL SELECT '20250814', 'SH002', 0.32, 105.2, 1.8, 1.02, 0.08, 28UNION ALL SELECT '20250814', 'SH003', 0.18, 76.9, 2.5, 0.68, 0.15, 42UNION ALL SELECT '20250814', 'SH004', 0.41, 120.7, 1.5, 1.25, 0.05, 22UNION ALL SELECT '20250814', 'SH005', 0.29, 98.3, 2.3, 0.95, 0.10, 30UNION ALL SELECT '20250814', 'SH006', 0.35, 112.1, 1.9, 1.10, 0.07, 25UNION ALL SELECT '20250814', 'SH007', 0.22, 82.4, 2.4, 0.75, 0.13, 38UNION ALL SELECT '20250814', 'SH008', 0.38, 109.6, 1.7, 1.08, 0.06, 26UNION ALL SELECT '20250814', 'SH009', 0.27, 92.8, 2.2, 0.88, 0.11, 33UNION ALL SELECT '20250814', 'SH010', 0.31, 10.5, 2.0, 0.99, 0.09, 29UNION ALL SELECT '20250814', 'SH011', 0.42, 10.5, 2.0, 0.99, 0.09, 29
)
SELECT sdate,-- 计算中位数(偶数时取平均值)(median_profit_rate_high + median_profit_rate_low) / 2.0 AS median_profit_rate,(median_avg_customer_price_high + median_avg_customer_price_low) / 2.0 AS median_avg_customer_price,(median_avg_num_purchases_high + median_avg_num_purchases_low) / 2.0 AS median_avg_num_purchases,(median_salevalue_finishrate_high + median_salevalue_finishrate_low) / 2.0 AS median_salevalue_finishrate,(median_abysku_rate_high + median_abysku_rate_low) / 2.0 AS median_abysku_rate,(median_dsi_high + median_dsi_low) / 2.0 AS median_dsi
FROM (SELECT sdate,MAX(CASE WHEN profit_rate_rank = CEILING(total_count/2.0) THEN profit_rate END) AS median_profit_rate_high,MAX(CASE WHEN profit_rate_rank = FLOOR(total_count/2.0)+1 THEN profit_rate END) AS median_profit_rate_low,MAX(CASE WHEN avg_customer_price_rank = CEILING(total_count/2.0) THEN avg_customer_price END) AS median_avg_customer_price_high,MAX(CASE WHEN avg_customer_price_rank = FLOOR(total_count/2.0)+1 THEN avg_customer_price END) AS median_avg_customer_price_low,MAX(CASE WHEN avg_num_purchases_rank = CEILING(total_count/2.0) THEN avg_num_purchases END) AS median_avg_num_purchases_high,MAX(CASE WHEN avg_num_purchases_rank = FLOOR(total_count/2.0)+1 THEN avg_num_purchases END) AS median_avg_num_purchases_low,MAX(CASE WHEN salevalue_finishrate_rank = CEILING(total_count/2.0) THEN salevalue_finishrate END) AS median_salevalue_finishrate_high,MAX(CASE WHEN salevalue_finishrate_rank = FLOOR(total_count/2.0)+1 THEN salevalue_finishrate END) AS median_salevalue_finishrate_low,MAX(CASE WHEN abysku_rate_rank = CEILING(total_count/2.0) THEN abysku_rate END) AS median_abysku_rate_high,MAX(CASE WHEN abysku_rate_rank = FLOOR(total_count/2.0)+1 THEN abysku_rate END) AS median_abysku_rate_low,MAX(CASE WHEN dsi_rank = CEILING(total_count/2.0) THEN dsi END) AS median_dsi_high,MAX(CASE WHEN dsi_rank = FLOOR(total_count/2.0)+1 THEN dsi END) AS median_dsi_low,total_countFROM (SELECT sdate,profit_rate,avg_customer_price,avg_num_purchases,salevalue_finishrate,abysku_rate,dsi,ROW_NUMBER() OVER (PARTITION BY sdate ORDER BY profit_rate) AS profit_rate_rank,COUNT(*) OVER (PARTITION BY sdate) AS total_count,ROW_NUMBER() OVER (PARTITION BY sdate ORDER BY avg_customer_price) AS avg_customer_price_rank,ROW_NUMBER() OVER (PARTITION BY sdate ORDER BY avg_num_purchases) AS avg_num_purchases_rank,ROW_NUMBER() OVER (PARTITION BY sdate ORDER BY salevalue_finishrate) AS salevalue_finishrate_rank,ROW_NUMBER() OVER (PARTITION BY sdate ORDER BY abysku_rate) AS abysku_rate_rank,ROW_NUMBER() OVER (PARTITION BY sdate ORDER BY dsi) AS dsi_rankFROM test_basedata) ranked_dataGROUP BY sdate, total_count
)  median_calculation

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

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

相关文章

【java中springboot引入geotool】

学习目标: 在Spring Boot项目中引入GeoTools库,可以按照以下步骤进行:理解GeoTools库的基本信息和用途 GeoTools是一个开源的Java库,用于处理地理信息系统(GIS)数据。它提供了对空间数据的读取、写入、查询…

多项目开发环境:如何使用update-alternatives管理多版本Java JDK?(Windows、Mac、Ubuntu)

如何使用update-alternatives管理多版本Java JDK?(Windows、Mac、Ubuntu) 📖 摘要 在实际开发中,往往会遇到既要维护老项目又要跟进新特性的场景,这就需要在一台机器上同时安装并切换多个Java JDK版本。本…

力扣57:插入区间

力扣57:插入区间题目思路代码题目 给你一个 无重叠的 ,按照区间起始端点排序的区间列表 intervals,其中 intervals[i] [starti, endi] 表示第 i 个区间的开始和结束,并且 intervals 按照 starti 升序排列。同样给定一个区间 newInterval […

KVM虚拟化技术解析:从企业应用到个人创新的开源力量

1 .KVM:开源虚拟化的核心引擎 KVM(Kernel-based Virtual Machine)作为Linux内核原生集成的开源虚拟化模块,彻底改变了现代数据中心的虚拟化格局。它通过将Linux内核转变为Type-1型虚拟机监控器(Hypervisor)…

28.Linux :通过源代码编译安装lamp

Linux :通过源代码编译安装lamp 区别特性源代码编译安装yum 安装安装方式从源代码编译构建预编译的二进制包自定义程度高度可定制有限定制性能优化可针对特定硬件优化通用优化依赖管理手动解决依赖关系自动解决依赖安装复杂度复杂,需技术经验简单&#x…

应用控制技术

一、 应用特征识别技术1.传统行为检测技术1.1 五元组检测原理1.2 配置思路1.3 效果展示需求背景21.4 传统行为检测的缺陷无法识别应用层内容:若应用更换端口(如QQ改用随机端口)或伪装协议(如HTTPS加密),传统…

当MySQL的int不够用了

关于int的长度很多时候看到int(8)这样的定义,其实这是工具导出的不专业。int是范围,不是长度。在开发有了共识(知道这个长度不算数,要看范围)以后,上来就是所有的类型都是bigint。int的范围int的取值范围是…

让AI学会“边做边想“:ReAct的实战指南

小智的求职困境有个叫小智的AI助手,它刚从"大语言模型大学"毕业,满怀信心地去应聘一家咨询公司的智能助理职位。面试官问:"北京和上海哪个城市人口更多?"小智立刻回答:"根据我的知识&#xf…

vue优化有哪些手段?

vue本身存在的方法 v-if 和v-show 的合理运用,频繁使用的组件使用v-show,不频繁的使用v-if,来减少dom的渲染路由懒加载 采用()>import(index.vue)当路由被访问的时候才回去加载使用keep-alive缓存页面,减少没必要的重复渲染同时也可以减少服务器的压力使用computed缓存数据,…

【图像算法 - 14】精准识别路面墙体裂缝:基于YOLO12与OpenCV的实例分割智能检测实战(附完整代码)

摘要: 裂缝是结构健康的重要隐患,传统人工巡检耗时耗力且易遗漏。本文将带您利用当前最先进的YOLO12实例分割模型,构建一个高效、准确、更高精度的裂缝检测系统。我们将从数据准备、模型训练到结果可视化,手把手实现一个完整的项目…

“让机器人更智慧 让具身体更智能”北京世界机器人大会行业洞察

2025年8月8日,世界机器人大会在北京盛大开幕。本届大会以“让机器人更智慧 让具身体更智能”为主题,由中国电子学会、世界机器人合作组织主办,包括开幕式、闭幕式、论坛等。同期举办世界机器人博览会、世界机器人大赛等活动,打造了…

PHP如何使用JpGraph生成折线图?

JpGraph是一个功能强大的PHP图表库,它通过封装GD库函数,为开发者提供了简单高效的数据可视化解决方案。作为专门用于绘制统计图的面向对象库,JpGraph支持创建折线图、柱状图、饼图等20余种图表类型,并能自动处理坐标轴、刻度、图例…

超级云平台:重构数字生态的“超级连接器“

在数字经济浪潮席卷全球的今天,企业数字化转型已从"选择题"变为"必答题"。然而,传统云服务模式因技术壁垒高、资源分散、协同效率低等问题,让许多企业在数字化转型中陷入"上云易、用云难"的困境。 在此背景下,一种以"全域资源整合+智能…

https如何保证传递参数的安全

HTTPS 并非直接“加密参数”,而是通过一整套加密传输机制,确保客户端与服务器之间所有通信内容(包括 URL 参数、表单数据、Cookie 等)在传输过程中不被窃听、篡改或伪造。其核心安全保障来自以下技术实现: 一、核心加密…

OpenHarmony之打造全场景智联基座的“分布式星链 ”WLAN子系统

1. 技术架构概览 无线局域网(Wireless Local Area Networks,WLAN),是通过无线电、红外光信号或者其他技术发送和接收数据的局域网,用户可以通过WLAN实现结点之间无物理连接的网络通讯。常用于用户携带可移动终端的办公、公众环境中。 WLAN组件子系统为用户提供WLAN基础功…

JMeter(入门篇)

一.简介 JMeter 是 Apache 组织使用 Java 开发的一款测试工具。 1、可以用于对服务器、网络或对象模拟巨大的负载 2、通过创建带有断言的脚本来验证程序是否能返回期望的结果 二.优缺点 优点: 开源、免费 跨平台 支持多协议 小巧 功能强大 缺点&#xff…

Lecture 12: Concurrency 5

回顾:并行用餐哲学家读者/作者问题哲学家进餐问题方案三:最大化并行需要一个更复杂的解决方案来实现最大的并行性 解决方案使用:state[N]:每个哲学家的当前状态(THINKING, HUNGRY, EATING&#…

UniApp 微信小程序之间跳转指南

概述 在UniApp开发中,经常需要实现从当前小程序跳转到其他微信小程序的功能。本文档详细介绍了如何在UniApp中实现微信小程序之间的跳转。 核心API uni.navigateToMiniProgram() 这是UniApp提供的用于跳转到其他微信小程序的核心API。 基本语法 uni.navigateToMiniP…

基于SpringBoot+Vue的养老院管理系统的设计与实现 智能养老系统 养老架构管理 养老小程序

🔥作者:it毕设实战小研🔥 💖简介:java、微信小程序、安卓;定制开发,远程调试 代码讲解,文档指导,ppt制作💖 精彩专栏推荐订阅:在下方专栏&#x1…

TRAE调教指南:用6A工作流项目规则+5S敏捷个人规则打造高效AI开发流程

TRAE调教指南:用6A工作流项目规则5S敏捷个人规则打造高效AI开发流程 引言:从"AI瞎写"到"精准交付"的实战手册一、什么是Rules:让AI"听话"的底层逻辑1. 告别重复指令疲劳2. 实现"千人千面"的个性化适…