Есть ли лучший способ вычисления медианы (не среднего)

Предположим, у меня есть следующее определение таблицы:

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

Я хочу вычислить МЕДИАНУ значения (не 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

Есть идеи?

14
задан Erwin Brandstetter 23 November 2011 в 23:37
поделиться