संपादित करें: मैं Django सबक्वेरी का उपयोग करके समाधान में सुधार करने में कामयाब रहा।
हम Django के aggregates with SubQuery expressions
:
-
सबसे कम
close
को पुनः प्राप्त करने के लिए एक सबक्वेरी बनाएं प्रत्येकsymbol
. के लिए :from django.db.models import OuterRef, Subquery, Min lows = StockHistory.objects.filter( stock=OuterRef('stock'), trading_date__gte='2017-05-04' ).values('stock__symbol') .annotate(low=Min('close')) .filter(trading_date__gte='2018-04-30')
-
विघटन:
filter
केवलtrading_date >= '2017-05-04'
के साथ स्टॉक प्राप्त करने के लिए क्वेरीसेट ।- "ग्रुप बाय"
stock__symbol
(Djnago में समूह के उदाहरण:GROUP BY ... MIN/MAX
,GROUP BY ... COUNT/SUM
)। annotate
सबसे कम (low
) प्रत्येक तत्व के लिए मूल्य।filter
केवलlow
वाले ऑब्जेक्ट प्राप्त करने के लिए क्वेरीसेट फिर से सेट करेंtrading_date >= '2018-04-30'
. को होने वाली फ़ील्ड ।
-
मध्यवर्ती परिणाम:
हालांकि इस स्तर पर हमें कोई परिणाम नहीं मिल सकता है, लेकिन सबक्वेरी इस तरह दिखेगी:
[ {'stock__symbol': 'A', 'low': Decimal('105.00000')}, {'stock__symbol': 'C', 'low': Decimal('90.00000')} ]
हमारे पास
trading_date
नहीं है ।
-
-
विशिष्ट
StockHistory
को पुनः प्राप्त करने के लिए सबक्वेरी का उपयोग करें ऑब्जेक्ट:StockHistory.objects.filter( stock__symbol=Subquery(lows.values('stock__symbol')), close=Subquery(lows.values('low')), trading_date__gte='2018-04-30' ).values('stock__symbol', 'trading_date', 'close') .order_by('stock__symbol')
-
ब्रेकडाउन:
lows.values('stock__symbol')
और Lows.values('low') सबक्वेरी से संबंधित मान प्राप्त करते हैं।filter
low
. के विरुद्ध क्वेरीसेट सबक्वेरी मान। साथ हीfilter
कमclose
. को खत्म करने के लिए निर्दिष्ट तिथि के विरुद्ध उस तारीख से पहले होने वाली कीमतें.- निर्दिष्ट
values
प्राप्त करें । - परिणाम को
stock__symbol
by द्वारा क्रमित करें (डिफ़ॉल्ट रूप सेascending
)
-
परिणाम:
[ { 'close': Decimal('105.00000'), 'trading_date': datetime.date(2018, 5, 3), 'stock__symbol': 'A' }, { 'close': Decimal('90.00000'), 'trading_date': datetime.date(2018, 5, 4), 'stock__symbol': 'C' } ]
-