Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

मैं इस जटिल SQL को Django मॉडल क्वेरी में कैसे परिवर्तित करूं?

संपादित करें: मैं Django सबक्वेरी का उपयोग करके समाधान में सुधार करने में कामयाब रहा।

हम Django के 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' के साथ स्टॉक प्राप्त करने के लिए क्वेरीसेट ।
      • "ग्रुप बाय" 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 low . के विरुद्ध क्वेरीसेट सबक्वेरी मान। साथ ही filter कम close . को खत्म करने के लिए निर्दिष्ट तिथि के विरुद्ध उस तारीख से पहले होने वाली कीमतें.
      • निर्दिष्ट values प्राप्त करें ।
      • परिणाम को stock__symbol by द्वारा क्रमित करें (डिफ़ॉल्ट रूप से 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. MySQL:दो कॉलम और योग द्वारा समूहित करें

  2. MySQL में केस स्टेटमेंट का उपयोग कैसे करें

  3. ImportError:Python2 का उपयोग कर mysql.connector नाम का कोई मॉड्यूल नहीं है

  4. mysqldump त्रुटि:पैकेट को max_allowed_packet से बड़ा मिला'

  5. mysql में कहां और इनर जॉइन का उपयोग करना