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

Django विंडो एनोटेशन अलग क्लॉज के साथ संयुक्त का उपयोग कर

मुझे लगता है कि मुख्य समस्या यह है कि आप उन कार्यों को मिला रहे हैं जो एनोटेशन में उपयोग किए जाते हैं, एक समूहबद्ध क्वेरी सेट उत्पन्न करता है जैसे कि एक ऑपरेशन के साथ योग जो सरल दिए गए क्वेरी सेट में प्रत्येक रिकॉर्ड के लिए एक नया फ़ील्ड बनाते हैं जैसे कि yesterday_count=Window(expression=Lag("count"))

तो आदेश देना वास्तव में यहां मायने रखता है। तो जब आप कोशिश करें:

WidgetCount.objects.distinct("date").annotate(date=Trunc("time", "day"), yesterday_count=Window(expression=Lag("count")))

परिणाम क्वेरीसेट केवल WidgetCount.objects.distinct("date") एनोटेट किया गया है, कोई समूहीकरण नहीं किया गया है।

मैं आपके संचालन को डीकॉप्लिंग करने का सुझाव दूंगा ताकि यह समझना आसान हो जाए कि क्या हो रहा है, और ध्यान दें कि आप अजगर वस्तु पर पुनरावृति कर रहे हैं, इसलिए कोई नया प्रश्न करने की आवश्यकता नहीं है!

उदाहरण के रूप में SUM संचालन का उपयोग करने पर ध्यान दें क्योंकि मुझे FirstValue ऑपरेटर के साथ एक अनपेक्षित त्रुटि मिल रही है। तो मैं उस विचार को प्रदर्शित करने के लिए सम के साथ पोस्ट कर रहा हूं जो वही रहता है। केवल acc_count=Sum("count") बदलकर पहले मान के लिए विचार समान होना चाहिए करने के लिए first_count=FirstValue("count")

for truncDate_groups in Row.objects.annotate(trunc_date=Trunc('time','day')).values("trunc_date")\
                      .annotate(acc_count=Sum("count")).values("acc_count","trunc_date")\
                      .order_by('trunc_date')\
                      .annotate(y_count=Window(Lag("acc_count")))\
                      .values("trunc_date","acc_count","y_count"):
    print(truncDate_groups)

आउटपुट:

{'trunc_date': datetime.datetime(2020, 1, 20, 0, 0, tzinfo=<UTC>), 'acc_count': 65, 'y_count': None}
{'trunc_date': datetime.datetime(2020, 1, 21, 0, 0, tzinfo=<UTC>), 'acc_count': 75, 'y_count': 162}
{'trunc_date': datetime.datetime(2020, 1, 22, 0, 0, tzinfo=<UTC>), 'acc_count': 162, 'y_count': 65}

यह पता चला है कि FirstValue ऑपरेटर को Windows फ़ंक्शन का उपयोग करने की आवश्यकता है ताकि आप FirtValue को नेस्ट न कर सकें और फिर अंतराल की गणना कर सकें, इसलिए इस परिदृश्य में मुझे बिल्कुल यकीन नहीं है कि क्या आप इसे कर सकते हैं। सवाल यह बन जाता है कि बिना नेस्टिंग विंडो के First_Value कॉलम तक कैसे पहुंचा जाए।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. नेस्टेड केस को सरल बनाएं जब स्टेटमेंट

  2. दो तालिकाओं में शामिल होने पर एक जॉइन कुंजी कैसे छोड़ें

  3. पोस्टग्रेज में इस समूह ActiveRecord क्वेरी को कैसे करें

  4. सरणी का उपयोग करके प्रारूप स्ट्रिंग को पोस्टग्रेज करें

  5. पायथन का उपयोग करके पोस्टग्रेएसक्यूएल में सीएसवी डेटा