एसक्यूएल आवश्यक कुछ इस तरह होगा:
SELECT *
FROM STUDENT
WHERE marks = (SELECT MAX(marks) FROM STUDENT)
Django के माध्यम से ऐसा करने के लिए, आप aggregation API उपयोग कर सकते हैं।
max_marks = Student.objects.filter(
subject='Maths'
).aggregate(maxmarks=Max('marks'))['maxmarks']
Student.objects.filter(subject='Maths', marks=max_marks)
दुर्भाग्य से, यह प्रश्न वास्तव में दो प्रश्न हैं। अधिकतम चिह्न एकत्रीकरण निष्पादित किया जाता है, परिणाम पायथन में खींचा जाता है, फिर दूसरी क्वेरी में भेज दिया जाता है। वहां (आश्चर्यजनक रूप से) कोई क्वेरीसेट पास करने का कोई तरीका नहीं है जो समूह के बिना एक समेकन है, भले ही इसे करना संभव हो। मैं यह देखने के लिए टिकट खोलने जा रहा हूं कि यह कैसे तय किया जा सकता है।
संपादित करें:
यह संभव किसी एक क्वेरी के साथ ऐसा करना है, लेकिन यह बहुत स्पष्ट नहीं है। मैंने इस विधि को कहीं और नहीं देखा है।
from django.db.models import Value
max_marks = (
Student.objects
.filter(subject='Maths')
.annotate(common=Value(1))
.values('common')
.annotate(max_marks=Max('marks'))
.values('max_marks')
)
Student.objects.filter(subject='Maths', marks=max_marks)
आप खोल में इस क्वेरी प्रिंट तो आपको मिलेगा:
SELECT
"scratch_student"."id",
"scratch_student"."name",
"scratch_student"."subject",
"scratch_student"."marks"
FROM "scratch_student"
WHERE (
"scratch_student"."subject" = Maths
AND "scratch_student"."marks" = (
SELECT
MAX(U0."marks") AS "max_marks"
FROM "scratch_student" U0
WHERE U0."subject" = Maths))
Django 1.11 (अल्फा में वर्तमान में) पर परीक्षण किया गया। यह निरंतर 1 द्वारा एनोटेशन को समूहीकृत करके काम करता है, जिसमें प्रत्येक पंक्ति समूहबद्ध होगी। इसके बाद हम इस समूह को कॉलम को चुनिंदा सूची (दूसरे values()
) से अलग करते हैं। Django (अब) यह निर्धारित करने के लिए पर्याप्त जानता है कि समूह अनावश्यक है, और इसे हटा देता है। सटीक एसक्यूएल के साथ एक ही क्वेरी छोड़कर हमें चाहिए।
स्रोत
2012-03-23 11:30:36
क्या है एफ में एफ ('max_mark')? –
@ चाडवर्नन, उन्हें एफ() अभिव्यक्ति कहा जाता है। वे आपको किसी अन्य कॉलम के मान का उपयोग करने की अनुमति देते हैं। https://docs.djangoproject.com/en/dev/topics/db/queries/#query-expressions –
यह काम नहीं करता है। परिणामी एसक्यूएल कुछ ऐसा है: 'चयन *, MAX ("चिह्न") छात्र "छात्र" से "max_mark" के रूप में "मार्क" = (MAX ("छात्र"। "अंक"))', जो बस सभी का चयन करता है छात्रों। –