Django 的开发版本具有 Avg、Count、Max、Min、StdDev、Sum 和 Variance 等聚合函数(链接文本)。中位数没有出现在列表中是否有原因?

实施一个似乎很容易。我错过了什么吗?聚合函数在幕后做了多少工作?

有帮助吗?

解决方案

因为中位数不是 SQL 聚合。例如,参见 PostgreSQL 聚合函数列表MySQL 聚合函数列表.

其他提示

这是你缺少的功能。通过它,你要查找的中线的查询集和列的名称:

def median_value(queryset, term):
    count = queryset.count()
    return queryset.values_list(term, flat=True).order_by(term)[int(round(count/2))]

这是并不难,因为其他一些响应似乎表明。最重要的是让数据库排序完成所有的工作,所以如果你有列已编制索引,这是一个超级便宜的操作。

(更新2016年1月28日) 如果你想更严格有关的偶数项的中位数的定义,这将平均在一起的两个中间值的值。

def median_value(queryset, term):
    count = queryset.count()
    values = queryset.values_list(term, flat=True).order_by(term)
    if count % 2 == 1:
        return values[int(round(count/2))]
    else:
        return sum(values[count/2-1:count/2+1])/Decimal(2.0)

那么,的原因的可能是你需要跟踪所有的计算中位数的数字。平均,计数,最大值,最小值,标准偏差,总和,方差都可以用恒定的存储需求计算。也就是说,一旦你“记录”一个数字,你再也不需要它。

FWIW,你需要跟踪变量是:最小,最大,计数,<n> = AVG,<n^2> =平均的值的平方的

一个很大的可能性是,中位数是不是标准的SQL的一部分。

此外,它需要排序,使得它相当昂贵计算。

我不知道你用的是什么DB后端,但如果你的数据库支持其它集合,或者你可以找到这样做的一个聪明的办法,你或许可以轻松地通过的汇总

FWIW,您可以扩展 PostgreSQL 8.4 及更高版本以具有中值聚合函数 这些代码片段.

其他代码片段(适用于旧版本的 PostgreSQL)是 此处显示. 。请务必阅读此资源的评论。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top