我通常使用NTILE功能將數據分成兩組,如果我在尋找一個答案那是足夠接近。但是,如果我需要確切的中位數(例如,偶數行的中點),我使用AWS Redshift Discussion Forum上建議的技術。
該技術按升序和降序對行進行排序,如果有奇數行,則返回中間行的平均值(即row_num_asc = row_num_desc),該行只是中間行本身。
CREATE TABLE temp (num SMALLINT);
INSERT INTO temp VALUES (1),(5),(10),(2),(4);
SELECT
AVG(num) AS median
FROM
(SELECT
num,
SUM(1) OVER (ORDER BY num ASC) AS row_num_asc,
SUM(1) OVER (ORDER BY num DESC) AS row_num_desc
FROM
temp) AS ordered
WHERE
row_num_asc IN (row_num_desc, row_num_desc - 1, row_num_desc + 1);
median
--------
4
如果有偶數行,它將返回兩個中間行的平均值。
INSERT INTO temp VALUES (9);
SELECT
AVG(num) AS median
FROM
(SELECT
num,
SUM(1) OVER (ORDER BY num ASC) AS row_num_asc,
SUM(1) OVER (ORDER BY num DESC) AS row_num_desc
FROM
temp) AS ordered
WHERE
row_num_asc IN (row_num_desc, row_num_desc - 1, row_num_desc + 1);
median
--------
4.5
更好的答案鏈接 – Keith
從表中選擇不同的中位數(字段)() –