Предположим, у меня есть следующее определение таблицы:
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
Есть идеи?