Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm cách nào để chuyển SQL phức tạp này thành một truy vấn mô hình Django?

CHỈNH SỬA: Tôi đã quản lý để cải cách giải pháp bằng cách sử dụng truy vấn con Django.

Chúng tôi có thể dịch truy vấn sang Django ORM bằng cách sử dụng aggregates with SubQuery expressions :

  1. Tạo một truy vấn con để truy xuất close thấp nhất cho mọi ký hiệu 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')
    
    • Phân tích:

      • filter bộ truy vấn để chỉ lấy các cổ phiếu có trading_date >= '2017-05-04' .
      • "GROUP BY" stock__symbol (ví dụ về nhóm theo Djnago: GROUP BY ... MIN/MAX , GROUP BY ... COUNT/SUM ).
      • annotate thấp nhất (low ) giá cho mọi yếu tố.
      • filter bộ truy vấn một lần nữa để chỉ nhận các đối tượng có low trường xảy ra vào trading_date >= '2018-04-30' .
    • Kết quả Trung gian:

      Mặc dù chúng ta không thể nhận được kết quả ở giai đoạn này, nhưng truy vấn con sẽ có dạng như sau:

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

      Chúng tôi thiếu trading_date .

  2. Sử dụng truy vấn con để truy xuất StockHistory cụ thể đối tượng:

    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')
    
    • Phân tích:

      • lows.values('stock__symbol') và lows.values ​​('low') truy xuất các giá trị tương ứng từ truy vấn con.
      • filter bộ truy vấn so với lows giá trị truy vấn con. Ngoài ra filter so với ngày được chỉ định để loại bỏ close thấp giá xảy ra trước ngày đó.
      • Nhận các giá trị symbol được chỉ định .
      • Sắp xếp kết quả theo stock__symbol (theo mặc định ascending ).
    • Kết quả:

      [
          {
              '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. Tôi không thể truy cập phiên bản PDO thô trong Laravel 5

  2. Làm cách nào để đặt mục đã chọn trong hộp thả xuống

  3. Ưu điểm / hạn chế tương ứng của Amazon RDS so với EC2 với MySQL là gì?

  4. Xếp hạng MYSQL SELECT của người dùng (nhiều hơn x &ít hơn y)

  5. Cách hoạt động của hàm LOCATE () trong MySQL