sql >> Databáze >  >> RDS >> Mysql

Jak převedu tento složitý SQL na dotaz modelu Django?

UPRAVIT: Podařilo se mi reformovat řešení pomocí dílčích dotazů Django.

Dotaz můžeme přeložit do Django ORM pomocí Django aggregates with SubQuery expressions :

  1. Vytvořte dílčí dotaz pro načtení nejnižší hodnoty close pro každý 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')
    
    • Rozdělení:

      • filter sada dotazů k získání pouze akcií s trading_date >= '2017-05-04' .
      • „GROUP BY“ stock__symbol (příklady skupin podle v Djnago:GROUP BY ... MIN/MAX , GROUP BY ... COUNT/SUM ).
      • annotate nejnižší (low ) cena za každý prvek.
      • filter sadu dotazů znovu, abyste získali pouze objekty s low pole vyskytující se trading_date >= '2018-04-30' .
    • Přechodný výsledek:

      Ačkoli v této fázi nemůžeme získat výsledek, dílčí dotaz bude vypadat takto:

      [
          {'stock__symbol': 'A', 'low': Decimal('105.00000')},            
          {'stock__symbol': 'C', 'low': Decimal('90.00000')}
      ]
      

      Chybí nám trading_date .

  2. Využijte dílčí dotaz k načtení konkrétní StockHistory objekty:

    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')
    
    • Rozdělení:

      • lows.values('stock__symbol') a lows.values('low') načítají příslušné hodnoty z dílčího dotazu.
      • filter sada dotazů proti lows hodnoty poddotazu. Také filter proti zadanému datu, aby se eliminovalo nízké close ceny vyskytující se před tímto datem.
      • Získejte zadané values .
      • Seřaďte výsledek podle stock__symbol (ve výchozím nastavení ascending ).
    • Výsledek:

      [
          {
              '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. Načítání řádků přidaných minulou hodinu

  2. Jak správně zvládnout zablokování InnoDB v Javě/JDBC?

  3. Ovlivňuje pořadí podmínek v klauzuli WHERE výkon MySQL?

  4. zobrazení odkazu v php