Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да конвертирам този сложен SQL в заявка за модел на Django?

РЕДАКТИРАНЕ: Успях да реформирам решението с помощта на подзаявки на Django.

Можем да преведем заявката в Django ORM с помощта на 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 ... 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да настроите varchar да има неограничена дължина?

  2. SQL ранг процентил

  3. php imap - вземете тялото и направете обикновен текст

  4. ImportError:Няма модул с име „MySQL“

  5. Много състояния на края на заявката в MySQL, всички връзки се използват за броени минути