12

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

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

4

6 回答 6

25

这是您缺少的功能。将查询集和要为其查找中值的列的名称传递给它:

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

这并不像其他一些回应似乎表明的那么难。重要的是让 db 排序完成所有工作,所以如果你已经为列建立索引,这是一个超级便宜的操作。

(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)
于 2012-02-29T16:56:05.703 回答
15

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

于 2009-06-03T03:27:26.280 回答
7

好吧,原因可能是您需要跟踪所有数字来计算中位数。Avg、Count、Max、Min、StDev、Sum 和 Variance 都可以根据恒定的存储需求进行计算。也就是说,一旦你“记录”了一个数字,你就再也不需要它了。

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

于 2009-06-03T00:57:17.037 回答
2

我不知道您使用的是什么数据库后端,但是如果您的数据库支持另一个聚合,或者您可以找到一种巧妙的方法,您可以通过Aggregate轻松访问它。

于 2009-06-03T03:56:12.847 回答
2

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

此外,它需要一种排序,因此计算起来非常昂贵。

于 2009-06-03T00:59:05.863 回答
1

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

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

于 2011-07-06T11:09:41.053 回答