編集: 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'
の株式のみを取得するクエリセット 。- "GROUP BY"
stock__symbol
(Djnagoでのgroup byの例: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
lows
に対するクエリセット サブクエリ値。また、filter
低いclose
を排除するために、指定された日付に対して その日付より前に発生した価格。- 指定された
values
を取得します 。 - 結果を
stock__symbol
で並べ替えます (デフォルトでは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' } ]
-