sql >> データベース >  >> RDS >> Mysql

この複雑なSQLをDjangoモデルクエリに変換するにはどうすればよいですか?

    編集: Djangoサブクエリを使用してソリューションを改革することができました。

    Djangoのaggregates with SubQuery expressions

    1. サブクエリを作成して、最も低い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がありません 。

    2. サブクエリを利用して、特定の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'
            }
        ]
        


    1. 現在の行をPostgreSQLの次の行および前の行と比較するにはどうすればよいですか?

    2. フィールドをidの値に更新するMySQLトリガー

    3. CodeIgniterフレームワークを使用して配列から複数の行を挿入するにはどうすればよいですか?

    4. 最も遅いクエリを見つける方法