ich verwende in der Regel die NTILE Funktion die Daten in zwei Gruppen zu teilen, wenn ich auf eine Antwort bin auf der Suche, die nahe genug ist. Wenn ich jedoch den genauen Median (z. B. den Mittelpunkt einer geraden Reihe von Reihen) haben möchte, verwende ich eine Technik, die auf der AWS Redshift Discussion Forum vorgeschlagen wird.
Bei dieser Technik werden die Zeilen sowohl in aufsteigender als auch in absteigender Reihenfolge angeordnet. Bei einer ungeraden Anzahl von Zeilen wird der Durchschnitt der mittleren Zeile (dh row_num_asc = row_num_desc) zurückgegeben, die einfach die mittlere Zeile ist selbst.
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
Wenn eine gerade Anzahl von Zeilen vorhanden ist, wird der Durchschnitt der beiden mittleren Zeilen zurückgegeben.
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
Bessere Antwort verbunden – Keith
wählen Sie distinkte Median (Feld) über() aus Tabelle –