Đây là chức năng bị thiếu của bạn. Vượt qua một queryset và tên của cột mà bạn muốn tìm trung vị cho:
def median_value(queryset, term):
count = queryset.count()
return queryset.values_list(term, flat=True).order_by(term)[int(round(count/2))]
Điều đó không khó như một số câu trả lời khác dường như chỉ ra. Điều quan trọng là để cho việc phân loại db làm tất cả công việc, vì vậy nếu bạn có cột đã được lập chỉ mục, đây là một hoạt động siêu rẻ.
(cập nhật 1/28/2016) Nếu bạn muốn nghiêm ngặt hơn về định nghĩa trung bình cho số mặt hàng, số này sẽ trung bình với giá trị của hai giá trị giữa.
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)
Nguồn
2012-02-29 16:56:05
Có tuyến tính, không phân loại, các thuật toán: http://valis.cs.uiuc.edu/~sariel/research/CG/applets/linear_prog/median.html –
thuật toán sai, tôi có nghĩa là trung bình của trung vị : http://en.wikipedia.org/wiki/Selection_algorithm#Linear_general_selection_algorithm_-_.22Median_of_Medians_algorithm.22 –
@Todd Gardner: Liên kết đầu tiên là "lựa chọn chung dựa trên phân vùng" và đó là O (nlogn) không tuyến tính. Trang web sai. Sẽ tốt hơn nếu xóa nhận xét đó, nhưng để lại nhận xét trung bình-trung bình. –