Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana cara mengubah SQL kompleks ini menjadi kueri model Django?

EDIT: Saya berhasil mereformasi solusi menggunakan subkueri Django.

Kami dapat menerjemahkan kueri ke Django ORM menggunakan aggregates with SubQuery expressions :

  1. Buat subkueri untuk mengambil close terendah untuk setiap 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')
    
    • Perincian:

      • filter queryset untuk mendapatkan hanya saham dengan trading_date >= '2017-05-04' .
      • "GROUP BY" stock__symbol (contoh group by di Djnago:GROUP BY ... MIN/MAX , GROUP BY ... COUNT/SUM ).
      • annotate terendah (low ) harga untuk setiap elemen.
      • filter queryset lagi untuk mendapatkan hanya objek dengan low kolom terjadi pada trading_date >= '2018-04-30' .
    • Hasil Antara:

      Meskipun kita tidak bisa mendapatkan hasil pada tahap ini, subquery akan terlihat seperti ini:

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

      Kami melewatkan trading_date .

  2. Gunakan subkueri untuk mengambil StockHistory tertentu objek:

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

      • lows.values('stock__symbol') dan lows.values('low') mengambil nilai masing-masing dari subquery.
      • filter queryset terhadap lows nilai subkueri. Juga filter terhadap tanggal yang ditentukan untuk menghilangkan close low yang rendah harga yang terjadi sebelum tanggal tersebut.
      • Dapatkan values yang ditentukan .
      • Pesan hasil berdasarkan stock__symbol (secara default ascending ).
    • Hasil:

      [
          {
              '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. Cara Mengimpor Database MySQL di Baris Perintah

  2. Antarmuka basis data GUI MySQL

  3. Fungsi PHP untuk keluar dari sintaks regexp MySQL

  4. Mendapatkan metadata tabel di MySQL

  5. Bagaimana cara menghitung kolom tabel?