In MariaDB/MySQL:
SELECT AVG(dd.val) as median_val
FROM (
SELECT d.val, @rownum:[email protected]+1 as `row_number`, @total_rows:[email protected]
FROM data d, (SELECT @rownum:=0) r
WHERE d.val is NOT NULL
-- put some where clause here
ORDER BY d.val
) as dd
WHERE dd.row_number IN ( FLOOR((@total_rows+1)/2), FLOOR((@total_rows+2)/2) );
Steve Cohen weist darauf hin, dass @rownum nach dem ersten Durchgang die Gesamtzahl der Zeilen enthalten wird. Dies kann verwendet werden, um den Median zu bestimmen, sodass kein zweiter Durchgang oder Join erforderlich ist.
Auch AVG(dd.val)
und dd.row_number IN(...)
wird verwendet, um bei einer geraden Anzahl von Datensätzen einen Median korrekt zu bilden. Begründung:
SELECT FLOOR((3+1)/2),FLOOR((3+2)/2); -- when total_rows is 3, avg rows 2 and 2
SELECT FLOOR((4+1)/2),FLOOR((4+2)/2); -- when total_rows is 4, avg rows 2 and 3
Schließlich enthält MariaDB 10.3.3+ eine MEDIAN-Funktion