Django的开发版本具有聚合函数,如Avg,Count,Max,Min,StdDev,Sum和Variance(link text)。列表中是否缺少中位数?
实施一个似乎很容易。我错过了什么吗?聚合功能在幕后做了多少?
答案 0 :(得分:20)
这是你失踪的功能。传递一个查询集和要查找中位数的列的名称:
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)
答案 1 :(得分:14)
因为中位数不是SQL聚合。例如,请参阅list of PostgreSQL aggregate functions和the list of MySQL aggregate functions。
答案 2 :(得分:7)
嗯,原因可能是您需要跟踪所有数字来计算中位数。 Avg,Count,Max,Min,StDev,Sum和Variance都可以根据不断的存储需求进行计算。也就是说,一旦你“记录”了一个数字,你就再也不需要它了。
FWIW,您需要跟踪的变量是:min,max,count,<n>
= avg,<n^2>
=平方值的平均值。
答案 3 :(得分:2)
很可能中位数不是标准SQL的一部分。
此外,它需要排序,使计算成本非常高。
答案 4 :(得分:2)
我不知道你正在使用什么db后端,但是如果你的数据库支持另一个聚合,或者你可以找到一种聪明的方法,你可以通过Aggregate轻松访问它。
答案 5 :(得分:1)
FWIW,您可以将PostgreSQL 8.4及更高版本扩展为具有these code snippets的中间聚合函数。
其他代码段(适用于较早版本的PostgreSQL)是shown here。请务必阅读此资源的评论。