有没有更好的方法来计算中位数(而不是平均值)

2023-12-22

假设我有以下表定义:

CREATE TABLE x (i serial primary key, value integer not null);

我想计算的中位数value(不是AVG)。中位数是将集合分为包含相同数量元素的两个子集的值。如果元素个数为偶数,则中位数为最低段中的最大值与最大段中的最低值的平均值。 (有关更多详细信息,请参阅维基百科。)

这是我计算中位数的方法,但我想一定有更好的方法:

SELECT AVG(values_around_median) AS median
  FROM (
    SELECT
       DISTINCT(CASE WHEN FIRST_VALUE(above) OVER w2 THEN MIN(value) OVER w3 ELSE MAX(value) OVER w2 END)
        AS values_around_median
      FROM (
        SELECT LAST_VALUE(value) OVER w AS value,
               SUM(COUNT(*)) OVER w > (SELECT count(*)/2 FROM x) AS above
          FROM x
          GROUP BY value
          WINDOW w AS (ORDER BY value)
          ORDER BY value
        ) AS find_if_values_are_above_or_below_median
      WINDOW w2 AS (PARTITION BY above ORDER BY value DESC),
             w3 AS (PARTITION BY above ORDER BY value ASC)
    ) AS find_values_around_median

有任何想法吗?


是的,在 PostgreSQL 9.4 中,您可以使用新引入的逆分布函数PERCENTILE_CONT() http://www.postgresql.org/docs/9.4/static/functions-aggregate.html#FUNCTIONS-ORDEREDSET-TABLE,也是 SQL 标准中指定的有序集聚合函数。

WITH t(value) AS (
  SELECT 1   UNION ALL
  SELECT 2   UNION ALL
  SELECT 100 
)
SELECT
  percentile_cont(0.5) WITHIN GROUP (ORDER BY value)
FROM
  t;

这个仿真MEDIAN() via PERCENTILE_CONT()也记录在这里 http://blog.jooq.org/2015/01/06/how-to-emulate-the-median-aggregate-function-using-inverse-distribution-functions/.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有更好的方法来计算中位数(而不是平均值) 的相关文章

  • 如何从 SQL Server 2008 查询结果中删除“NULL”

    我有一个包含 59 列和超过 17K 行的表 很多行都有NULL在某些列中 我想删除NULL以便查询返回空白 而不是NULL 我可以运行一些更新功能来替换所有NULL with 使用 SQL Server 2008R2 Management
  • SELECT max(x) 返回 null;我怎样才能让它返回0?

    运行以下命令时如何返回 0 而不是 null SELECT MAX X AS MaxX FROM tbl WHERE XID 1 假设没有XID 1的行 or SELECT coalesce MAX X 0 AS MaxX FROM tbl
  • SQL查询查找表的主键?

    我怎样才能找到哪一列首要的关键使用查询来创建表 这是重复的question https stackoverflow com questions 893874 mysql determine tables primary key dynami
  • 日期语句之间的 JPQL SELECT [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我想将此 SQL 语句转换为等效的 JPQL SELECT FROM events WHERE events date BETWE
  • 我不断收到错误“关系 [TABLE] 不存在”

    我一直在尝试查询数据库中的两个表 在服务器资源管理器中 我可以看到两个表 甚至可以看到其中的列 我们将它们称为 Schema table1 和 Schema table2 其中 Schema 的第一个字母大写 我尝试运行以下查询 selec
  • Supabase 客户端权限被拒绝,模式为 public

    每当我尝试使用 supabase supabase js 查询数据库时 都会收到错误 error hint null details null code 42501 message permission denied for schema
  • 如何获取自定义订单的结果? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 代替ASC or DESC 我希望我的查询结果采用特定的自定义顺序 例如 如果我想要的结果不是 A B C D 而是 P A L H 该怎么
  • 是否可以引用同一个表中的不同列?

    如果博客有一个 类别 表 如下所示 CREATE TABLE categories id INTEGER PRIMARY KEY AUTO INCREMENT parent id INTEGER NOT NULL name VARCHAR
  • SELECT NULL、*、NULL、NULL 中令人困惑的 SQL 错误

    的背景我试图解决第四个现实任务 https www hackthissite org playlevel 4 在 hackthissite org 中 无法确切地弄清楚我应该在 URL 中注入什么 SQL 来检索电子邮件列表 浪费了几个小时
  • 如何从子查询 SQLite 接收两个值

    我是一个自学的 SQLite 新手 我有三个表 person pet person pet schema 是 CREATE TABLE person id INTEGER PRIMARY KEY first name TEXT last n
  • SQL WHERE 取决于星期几

    我需要检查不同日期的记录 具体取决于当前是一周中的哪一天 在周五 我需要它查看整个下周 直到下周日 在其他任何一天 它都应该检查当前周 直到下周日 我目前有以下内容 但由于语法错误而无法工作 是否可以做一个CASE WHEN里面一个WHER
  • 使用默认路径中的文件创建数据库

    我想创建一个创建数据库的 SQL 脚本 现在 我有这个 CREATE DATABASE Documents ON PRIMARY NAME N Documents FILENAME N Documents mdf LOG ON NAME N
  • 查询和扫描多行性能缓慢

    下面的查询一行的执行时间为 6 18 分钟 Exception type 1 的基数值为 3 我不知道如何提高性能 Query select count 1 as rage tap from summary funnel 1066 s jo
  • 在 MySQL 中将值设置为 NULL

    我想要一个值被设置为NULL如果我提交的表单中的文本框中没有输入任何内容 我怎样才能做到这一点 我试过插入 NULL 但这只是添加了这个词NULL进入现场 我不确定我应该为此提供什么代码 我只是编写一个 UPDATE 查询 不要放NULL更
  • 从逗号分隔的字符串中删除重复项 (Amazon Redshift)

    我正在使用亚马逊红移 我在该字符串中有一个列存储为逗号分隔 例如Private Private Private Private Private Private United Healthcare 我想使用删除其中的重复项query 所以结果
  • 在查询中创建临时变量

    我希望能够在查询中创建一个临时变量 而不是存储过程或函数 它不需要声明和设置 这样我在调用它时就不需要传递查询参数 正在努力朝这个方向努力 Select field1 tempvariable 2 2 newlycreatedfield t
  • 同一表中同一列的 SQL 完全外连接

    这可能更多的是一个设计问题 但我希望这在没有太多巫术的情况下是可能的 假设我有一个这样的表 SELECT FROM stuff id grp 1 a 2 a 3 a 1 b 2 b 4 b 我想要得到这样的东西 ID 按列分组 a id b
  • 如何创建从表中最大值开始的 Oracle 序列?

    尝试在 Oracle 中创建一个以特定表中的最大值开始的序列 为什么这不起作用 CREATE SEQUENCE transaction sequence MINVALUE 0 START WITH SELECT MAX trans seq
  • PostgreSQL 中的日期比较

    有没有办法比较同一个表中的两个日期 如下所示 SELECT FROM mytable WHERE date 1 date 2 我正在寻找最简单的方法来作为更新语句的一部分来执行此操作 是的 你可以这么做 就那么简单 看看date timeP
  • 错误:运算符不存在:整数 = 字符变化,使用 Postgres 8.2

    我有一个用旧版本的 Eclipse Ganymede 如果我没记错的话 开发的 Java EE Web 应用程序 我最近迁移到 Kubuntu 12 04 LTS 并将应用程序迁移到 Eclipse Kepler 我从 Eclipse 网站

随机推荐

  • 将函数应用于 Python 字典的所有键

    我想转换 Python 字典的所有键 例如 如果键是整数 我想将每个键更改为原始值乘以100 实现这一目标的最高效的方法是什么 我现在这样做的方法是将原始密钥存储在set并删除这些键 用新键替换它们 这有一个问题 如果我有一个key 2 a
  • R Plotly - 设置高度时图表顶部和底部有大量未使用空间

    我正在尝试创建一个在 y 轴上包含分类数据的散点图 以便可以通过向下滚动来查看数据 为了实现这一点 我将刻度类型设置为 类别 将其模式设置为 线性 并手动设置高度 以便为绘图提供足够的空间来显示每个标签 然而 这让我在情节的顶部和底部留下了
  • App Engine 默认 Django 版本更改

    自从 App Engine 1 4 2 发布以来 我在生产日志中收到如下警告 您正在使用默认的 Django 版本 0 96 默认的 Django App Engine 中的版本将发生变化 在不久的将来发布 请 显式调用 use libra
  • 从 F# 调用具有多个参数的 C# 函数

    打电话很方便f Func lt T T gt 从 F 为 T gt T通过使用f Invoke 但我该怎么打电话f Func lt T T T gt 从 F 为 T gt T gt T 当我使用f Invoke I get T T gt T
  • 尝试以 pdf 形式查看数据,pdf 为空白

    我试图在下一个选项卡中打开 pdf 文件 它打开但始终为空白 我正在从 springboot 中的文件夹中调用 pdf 文件 数据确实显示在控制台日志中 弹簧代码 RequestMapping value report method Req
  • 如何从源映射中获取原始行号和符号

    我正在记录我网站上的 javascript 错误 但文件已最小化 因此我无法获得有意义的行号 不过 我确实有源地图 是否有服务 脚本 npm 模块或任何可以帮助我将缩小版本中的行号 翻译 为有用的内容的东西 我使用这个 npm 模块找到了答
  • 实体框架和使用 WCF 服务

    我正在获取隐藏在 WCF 服务后面的数据库的数据 在我有来自 Web 服务的自定义对象的场景中是否可以使用实体框架 无法访问外部数据库 当前没有插入 更新 删除逻辑的计划 从空的 EF 模型开始并添加一个实体 我在编译时收到此错误 没有为
  • 如何使用 Spring Security 3.1 更改当前用户的登录名?

    我要求每个用户在保持登录状态时都可以更改自己的用户名 问题是如何更新用户名 Principal 在 Spring Security 的身份验证令牌中 我必须更新它 因为我在某些业务用例中使用身份验证令牌中的主体名称来识别用户 我使用基于表单
  • 字节从 py2 到 py3 的行为变化

    讨论发生后我很好奇这个问题 https stackoverflow com questions 18616657 how to encode integer in to base64 string in python 3 看来 的行为byt
  • 为什么在运行时更改 LD_LIBRARY_PATH 不会在加载可执行文件后反映到可执行文件上

    我正在尝试改变LD LIBRARY PATH来自我的 C 程序 我可以使用它来获取它的值getenv LD LIBRARY PATH 并使用设置其值setenv http man7 org linux man pages man3 sete
  • 如何使用 MinGW 创建微型 PE (Win32) 可执行文件

    我有以下 C 程序 include
  • 如何在执行脚本之前自动清除 VSCode 中的终端? [复制]

    这个问题在这里已经有答案了 我目前正在使用 VS Code 来学习 Python 所以我必须每分钟运行 10 15 次脚本 只是做一些小的编辑并学习所有的东西 我正在 VS code 的集成终端中运行脚本 所以显然终端变得非常混乱 我必须始
  • Anaconda 与 Python 有何关系?

    我是初学者 我想学习计算机编程 所以 现在我已经开始自学Python 并掌握了一些C和Fortran编程的知识 现在 我已经安装了Python 3 6 0版本 并且我一直在努力寻找合适的文本来学习这个版本的Python 甚至在线讲座系列也要
  • 类型转换和类型转换之间的区别? [复制]

    这个问题在这里已经有答案了 可能的重复 铸造和转换之间有什么区别 https stackoverflow com questions 3166840 what is the difference between casting and co
  • 将配置文件的内容读取到与其关联的 dll 中

    我已将字符串保存在 dll 应用程序的设置中 我想找回它们 这是我的 dll 的配置文件
  • 如果已命中断点 A,则启用断点 B

    我经常发现自己在代码中的某处设置断点 A 并在命中断点时手动启用一个或多个断点 一个典型的情况是当我正在调试单元测试并且不关心前面的测试时 void testAddZeros Number a 0 Number b 0 Number res
  • 给定 WSDL 的 Web 服务客户端

    我正在尝试用 Java 创建一个 Web 服务客户端 我不知道该怎么做 这是 WSDL 的 URL https testservices gatewayedi com PayerList payerlist asmx wsdl https
  • 合并多列,排除空值

    我试图弄清楚如何组合多个列 不包括 NA 值 输入数据框 data lt data frame id c 1 3 Item1 c Egg Item2 c Chicken Flour Item3 c Bread Item4 c Milk 所需
  • docker 中的 Plotly dash 不加载资源

    我有一个多页破折号应用程序 在本地运行时可以按预期工作 女服务员服务 listen 0 0 0 0 80 web app wsgi application 因此资产文件夹中的所有资产都正确加载 图像加载了src app get asset
  • 有没有更好的方法来计算中位数(而不是平均值)

    假设我有以下表定义 CREATE TABLE x i serial primary key value integer not null 我想计算的中位数value 不是AVG 中位数是将集合分为包含相同数量元素的两个子集的值 如果元素个数