Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak przekonwertować ten złożony SQL na zapytanie modelu Django?

EDYTUJ: Udało mi się zreformować rozwiązanie za pomocą podzapytań Django.

Możemy przetłumaczyć zapytanie do ORM Django za pomocą aggregates with SubQuery expressions :

  1. Utwórz podzapytanie, aby pobrać najniższe close dla każdego 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')
    
    • Podział:

      • filter queryset do pobrania tylko akcji z trading_date >= '2017-05-04' .
      • „GRUPA WG” stock__symbol (przykłady grupowania według w Djnago:GROUP BY ... MIN/MAX , GROUP BY ... COUNT/SUM ).
      • annotate najniższy (low ) cena za każdy element.
      • filter queryset ponownie, aby uzyskać tylko obiekty z low pole występujące w dniu trading_date >= '2018-04-30' .
    • Wynik pośredni:

      Chociaż na tym etapie nie możemy uzyskać wyniku, podzapytanie będzie wyglądać tak:

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

      Brakuje trading_date .

  2. Wykorzystaj podzapytanie, aby pobrać konkretną StockHistory obiekty:

    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')
    
    • Podział:

      • lows.values('stock__symbol') i lows.values('low') pobierają odpowiednie wartości z podzapytania.
      • filter zestaw zapytań w stosunku do lows wartości podzapytania. Również filter w stosunku do określonej daty w celu wyeliminowania niskiego close ceny występujące przed tą datą.
      • Pobierz określone values .
      • Uporządkuj wynik według stock__symbol (domyślnie ascending ).
    • Wynik:

      [
          {
              '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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL:Po co określać szerokość wyświetlania bez używania zerowego wypełnienia?

  2. Migracje baz danych na produkcję django

  3. Jak przekazać tabelę jako parametr do MySqlCommand?

  4. Tabela znajomych MySQL

  5. Jak zmienić format daty i godziny w MySQL?