【发布时间】:2011-04-13 17:03:13
【问题描述】:
假设我有以下表定义:
CREATE TABLE x (i serial primary key, value integer not null);
我想计算 value 的 MEDIAN(不是 AVG)。中位数是将集合划分为两个包含相同数量元素的子集的值。如果元素个数是偶数,则中位数是最低段的最大值和最大段的最小值的平均值。 (有关详细信息,请参阅维基百科。)
这是我设法计算 MEDIAN 的方法,但我想一定有更好的方法:
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
有什么想法吗?
【问题讨论】:
-
平均值和平均值是同义词。您要问的是中位数:en.wikipedia.org/wiki/Median
-
平均值 en.wikipedia.org/wiki/Arithmetic_mean 只是数字的总和除以计数。
-
确实如此。有了这些信息,也许谷歌会证明更有收益=)
-
@ChrisF - 不是骗子。不同的关系型数据库。 postgressql 可能比 mysql 有更好的方法,因为它支持分析函数和用户定义的聚合wiki.postgresql.org/wiki/Aggregate_Median
标签: sql postgresql aggregate-functions