Angenommen, ich habe die folgende Tabellendefinition:
CREATE TABLE x (i serial primary key, value integer not null);
Ich möchte den MEDIAN der folgenden Werte berechnen value
(nicht die AVG). Der Median ist ein Wert, der die Menge in zwei Teilmengen mit der gleichen Anzahl von Elementen teilt. Wenn die Anzahl der Elemente gerade ist, ist der Median der Durchschnitt des größten Wertes im kleinsten Segment und des kleinsten Wertes im größten Segment. (Siehe Wikipedia für weitere Einzelheiten).
So habe ich es geschafft, den MEDIAN zu berechnen, aber ich denke, es muss einen besseren Weg geben:
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
Irgendwelche Ideen?