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

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(使用前将#替换为@)

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

  • Yii 查询时对相关模型的限制

    我遇到了极限问题 我正在使用的代码如下 model PostCategory model record model gt with array posts gt array order gt posts createTime DESC li
  • 在存储过程结束时显式删除本地临时表有什么好处?

    考虑以下伪 T SQL 代码 由存储过程执行 CREATE TABLE localTable
  • 从一个sql服务器选择到另一个sql服务器?

    我想将一台服务器 Data Old S1 中的一个表 T1 在 DB1 中 中的数据选择到另一台服务器 Data Latest S2 中的另一个表 T2 在 DB2 中 中的数据 我怎样才能做到这一点 请注意服务器的命名方式 查询也应该考虑
  • 多租户 Rails 应用:不同技术的优缺点是什么?

    我最初是为一位客户编写 Ruby on Rails 应用程序的 现在 我正在更改它 以便它可以用于不同的客户 我的最终目标是某些用户 不是我 可以单击按钮并创建一个新项目 然后生成所有必要的更改 新架构 新表 代码处理 无需任何人需要我编辑
  • 对具有许多索引的表进行缓慢的批量插入

    我尝试将数百万条记录插入到具有 20 多个索引的表中 在上次运行中 每 100 000 行花费了 4 个多小时 并且查询在 3 5 天后被取消 您对如何加快速度有什么建议吗 我怀疑是索引太多的原因 如果你也这么认为 如何在操作前自动删除索引
  • SQL Server 中的派生表

    我有这两个疑问 我不知道如何将它们组合在一起来制作派生表 我假设使用第二个查询作为主查询 并在主查询的 FROM 子句中使用第一个查询 SELECT EmailAddress Orders OrderID SUM ItemPrice Qua
  • 如何进行 PostgreSQL 交叉表查询,列中缺少值

    我正在尝试使用 PostgreSQL 9 5 交叉表查询创建周转时间报告 其中推荐分为第 1 2 3 4 gt 4 天 请参见下面的输出 但是 如果我运行查询并且第 2 天的值丢失 则我的查询可以正常工作 整行将向左移动一个单元格 所以第二
  • 当我输入 dateadd 或 datediff 代码时,我总是收到此错误“ORA-00904“DATEADD”无效标识符。”

    我有一个大学项目 并且有一个包含入院和出院日期属性的患者表 我需要删除超过 7 年的记录 我使用了以下代码 delete from patient where dis date gt datedadd yy 7 getdate 我收到错误
  • 如何对 SQL Server Express 进行实时更改

    我一直在使用 VS studio 开发一个 ASP NET Web 应用程序 我正在使用 SQL Server Express 在开发过程中 我一直在我的服务器上测试我的网络应用程序 每次我需要更新数据库时 我都会简单地删除旧数据库 位于我
  • 多级排序

    我有一个表 其中包含一些记录 其中包含名称 评级等字段 我首先想要根据评级将结果限制为 20 进行排序 然后在此结果集上想要进一步应用基于名称的排序 我知道要排序我们需要使用像这样的查询 Select from table order by
  • 计算树中值的总和(递归查询)

    我在表员工 id name parentid 中有树结构 并且该表可以嵌套 employees 与另一个具有列 id employeeid quantity 的 Sales 表是一对多关系 每个员工都有销售数量 我想计算每个员工以及儿童员工
  • Pyspark - 一次聚合数据帧的所有列[重复]

    这个问题在这里已经有答案了 我想将数据框分组到单个列上 然后对所有列应用聚合函数 例如 我有一个包含 10 列的 df 我希望对第一列 1 进行分组 然后对所有剩余列 均为数字 应用聚合函数 sum 与此等效的 R 是 summarise
  • oracle中的区间函数

    Query SELECT INTERVAL 300 month INTERVAL 54 2 year to month INTERVAL 11 12 10 1234567 hour to second FROM DUAL 上述查询的输出是
  • 在 SQL Server SELECT 语句中使用 CASE 时消除 NULL

    我有一份大而混乱的报告要写 它连接了 5 个表 一个表中有一列用于多个不同的值 本质上是一个 标签 列 其中标签根据用户想要使用的各种元数据的类型以创造性的方式使用 因此 我对报告的查询返回 3 个几乎相同的行 仅 标签 列有所不同 例如
  • 优化 LINQ 查询 - 如何缩短执行时间?

    我想知道是否有一个好的方法来优化我的 LINQ 查询 我正在使用类似于以下内容的 LINQ 查询从数据库检索数据 PKs is a list of integers var import context table Where x gt P
  • 仅基于月份和年份的 SQL Server 日期比较

    我无法确定仅根据月份和年份比较 SQL 中的日期的最佳方法 我们根据日期进行计算 由于计费是按月进行的 因此该月的日期会造成更多障碍 例如 DECLARE date1 DATETIME CAST 6 15 2014 AS DATETIME
  • 将一个大的 postgres 表拆分为多个 csv

    我正在使用以下 psql 查询连接到远程主机并将一个大表拆分为多个 csv 文件 psql h xx p xx U xx d xx c COPY select from table TO program split lines 1000 f
  • 关系代数 - 笛卡尔积与自然连接?

    我正在准备考试 但未能找到一个可靠的标准来确定笛卡尔积是否x要使用或者如果自然连接 X 是要使用的 我想出了一个粗略的指南 如果您需要投影与要连接的表中的属性同名的属性 则必须使用x并说明要投影的表名称 tableA colname1 ta
  • 执行存储过程时 ExecuteNonQuery() 返回 -1

    我正在尝试在 Visual Studio 中执行存储过程 下面给出 CREATE PROCEDURE dbo addStudent stuName varchar 50 address varchar 100 tel varchar 15
  • 当您执行“SELECT *”时,SQL Server 如何确定列的顺序?

    当您执行以下操作时 SQL Server 如何确定列的顺序SELECT 我知道 订购依据 对于订购至关重要data 但我预计列名保持一致 注意 我的代码是not取决于返回列的实际顺序 我只想知道 SQL Server 如何决定对列名进行排序

随机推荐

  • 将函数应用于 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 中位数是将集合分为包含相同数量元素的两个子集的值 如果元素个数