문제

Django의 개발 버전에는 AVG, Count, Max, Min, STDDEV, SUM 및 분산과 같은 집계 기능이 있습니다.링크 텍스트). 중앙값이 목록에서 누락 된 이유가 있습니까?

하나를 구현하는 것은 쉬운 것 같습니다. 내가 뭔가를 놓치고 있습니까? 집계 함수는 무대 뒤에서 얼마입니까?

도움이 되었습니까?

해결책

중앙값은 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))]

그것은 다른 응답 중 일부가 나타내는 것처럼 어렵지 않았습니다. 중요한 것은 DB 분류가 모든 작업을 수행하도록하는 것입니다. 따라서 열이 이미 인덱스 된 경우 매우 저렴한 작업입니다.

(업데이트 1/28/2016)짝수의 항목에 대한 중앙값의 정의에 대해 더 엄격하게 원한다면, 이는 두 중간 값의 값을 평균화합니다.

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)

글쎄, 이유 아마도 중간 값을 계산하기 위해 모든 숫자를 추적해야 할 것입니다. AVG, Count, Max, Min, STDEV, Sum 및 Difiance는 모두 지속적인 저장 요구로 계산할 수 있습니다. 즉, 일단 당신이 "녹음"숫자는 다시는 필요하지 않을 것입니다.

FWIW, 추적 해야하는 변수는 다음과 같습니다. Min, Max, Count, <n> = avg, <n^2> = 값의 제곱의 AVG.

강력한 가능성은 중앙값이 표준 SQL의 일부가 아니라는 것입니다.

또한 정렬이 필요하므로 계산 비용이 많이 듭니다.

어떤 DB 백엔드를 사용하고 있는지 전혀 모르겠지만 DB가 다른 집계를 지원하거나 영리한 방법을 찾을 수 있다면 쉽게 액세스 할 수 있습니다. 골재.

fwiw, postgresql 8.4 이상을 연장하여 이 코드 스 니펫.

기타 코드 스 니펫 (이전 버전의 PostgreSQL에서 작동)은 다음과 같습니다. 여기에 표시됩니다. 이 리소스에 대한 의견을 읽으십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top