في عداد المفقودين 'متوسط' دالة تجميعية في جانغو?

StackOverflow https://stackoverflow.com/questions/942620

سؤال

تطوير نسخة من جانغو لديها وظائف الكلي مثل Avg, عد, Max, Min, StdDev, مجموع, و الفرق (وصلة النص).هل هناك سبب متوسط مفقود من القائمة ؟

تنفيذ أحد يبدو أنه سيكون من السهل.أنا في عداد المفقودين شيئا ؟ كم هي وظائف الكلي به وراء الكواليس ؟

هل كانت مفيدة؟

المحلول

لأن متوسط ليس SQL التجميعية.انظر ، على سبيل المثال ، قائمة كيو وظائف الكلي و قائمة الخلية وظائف الكلي.

نصائح أخرى

ها هي وظيفتك المفقودة. اجتيازها استعلام واسم العمود الذي تريد العثور عليه الوسيط الخاص ب:

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, عد, Max, Min, الشبكة, مجموع, و الفرق يمكن احتساب المستمر مع احتياجات التخزين.هذا هو مرة واحدة كنت "سجل" عددا عليك أبدا مرة أخرى.

FWIW, المتغيرات تحتاج إلى المسار:min, max, العد ، <n> = avg ، <n^2> = متوسط مربع من القيم.

احتمال قوي هو أن الوسيط ليس جزءا من SQL القياسية.

أيضا، يتطلب نوعا ما، مما يجعله مكلفا للغاية للحساب.

ليس لدي أي فكرة عن DB Backend الذي تستخدمه، ولكن إذا كان DB يدعمك مجمعة أخرى، أو يمكنك العثور على طريقة ذكية للقيام بذلك، فمن المحتمل أن تتمكن من الوصول إليها بسهولة تجمع.

FWIW، يمكنك تمديد postgresql 8.4 وما فوق للحصول على وظيفة إجمالية متوسط مقتطفات شفرة هذه.

مقتطفات رمز أخرى (التي تعمل في الإصدارات القديمة من postgresql) يظهر هنا. وبعد تأكد من قراءة التعليقات لهذا المورد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top