Cálculo da mediana no PostgreSQL

A mídia (não o AVG) não tem suporte direto no PostgreSQL, mas, felizmente, pode ser facilmente calculada usando o seguinte:

SELECT CASE WHEN c % 2 = 0 AND c > 1 THEN (a[1]+a[2])/2 ELSE a[1] END
FROM

(
SELECT ARRAY
(SELECT my_col FROM my_table ORDER BY my_cal OFFSET (c-1)/2 LIMIT 2) AS a, c
FROM
(SELECT count(*) AS c FROM my_table where my_col is not null) AS count
OFFSET
0
)
AS midrows
;

Com base em uma boa dica encontrada em http://okbob.blogspot.de/2009/11/aggregate-function-median-in-postgresql.html

A seguir está outra ideia, encontrada em http://blog.carbonfive.com/2013/01/17/postgresql-aggregates-medians-and-a-brief-command-reference/ , que usa a ntilefunção para calcular um valor aproximado mediana. funciona bem se o número de linhas for desigual, mas não se o número de linhas for par

SELECT
MAX
(column) as "Median of Column"
FROM

(
SELECT

column
,
ntile
(2) OVER (ORDER BY column) AS bucket
FROM

table

) as t
WHERE bucket
= 1
GROUP BY bucket
;