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

假设我有下面的表定义:
CREATE TABLE x (i serial primary key,value integer not null);

我想计算MEDIAN的价值(而不是AVG).中位数是将集合分成两个包含相同数量元素的子集的值.如果元素数量是偶数,则中位数是最低分数中最大值的平均值,也是最大分数的最小值. (详见维基百科)

这是我如何设法计算MEDIAN,但我想有一个更好的方法

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

有任何想法吗?

解决方法

确实有一个更简单的方法.在Postgres中,您可以定义自己的聚合函数.我向Postgresql代码片段发送了一些功能来做中位数以及模式和范围.

http://wiki.postgresql.org/wiki/Aggregate_Median

相关文章

(一)日志传送架构 (1.1)相关服务器 主服务器 :用于生产的服务器,上面运行这生产SQL Server数据库...
(一)事故背景 最近在SQL Server 2012生产数据库上配置完事物复制(发布订阅)后,生产数据库业务出现了...
(一)测试目的 目前公司使用的SQL SERVER 2012高可用环境为主备模式,其中主库可执行读写操作,备库既...
(一)背景个人在使用sql server时,用到了sql server的发布订阅来做主从同步,类似MySQL的异步复制。在...
UNION和OR谓词 找出 product 和 product2 中售价高于 500 的商品的基本信息. select * from product wh...
datawhale组队学习task03