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

रेल / पोस्टग्रेज:"ग्रुप बाय क्लॉज में दिखाई देना चाहिए या एक समग्र कार्य में उपयोग किया जाना चाहिए"

आपकी गलती यह थी कि शायद डिफ़ॉल्ट दायरे में भरकर_एट का इस्तेमाल किया जाए।

डिफ़ॉल्ट स्कोप को खत्म करने के लिए आप इसे अनस्कोप्ड का उपयोग करके ठीक कर सकते हैं:

Income.unscoped
 .group('date(filled_at)')
 .having("date(filled_at) > ?", Date.today - n)
 .sum(:lines_price)

या

Income.unscoped
   .group('date(filled_at)')
   .having("date(filled_at) > ?", Date.today - n)
   .sum(:lines_price)
   .order('date(filled_at) ASC')

लेकिन मुझे लगता है कि होने के बजाय जहां का उपयोग करना बेहतर होगा

Income.unscoped
  .where("date(filled_at) > TIMESTAMP ?", Date.today - n)
  .group('date(filled_at)')
  .sum(:lines_price)
  .order('date(filled_at) ASC')

SQLFiddle

आपको TIMESTAMP का उपयोग करने के बारे में सावधान रहना होगा क्योंकि 2012-12-04 2012-12-04 00:00:00 हो जाएगा, इसलिए यदि आप परिणाम में इस दिन को नहीं चाहते हैं तो Date.today - (n - 1)

अगर आप fill_at कॉलम पर इंडेक्स बनाते हैं

 create index incomes_filled_at on incomes(filled_at);

माइग्रेशन:

 add_index :incomes, :filled_at

और आपके पास इस तालिका में बहुत अधिक डेटा है, फ़िल्टरिंग में अनुक्रमणिका का उपयोग किया जाएगा। तो क्वेरी बहुत तेज होनी चाहिए।

तो बस दोनों लिखें और परीक्षण करें जो तेज़ है (यदि आपके पास एक नहीं है तो आपको fill_at पर अनुक्रमणिका बनाना होगा)।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL 9.4 में कैशिंग कॉन्ट्रिब के pg_prewarm और pg_hibernator का उपयोग करना।

  2. वर्तमान घंटे के डेटा का चयन पोस्टग्रेज

  3. पोस्टग्रेज:एक जेसन स्ट्रिंग को टेक्स्ट में कैसे परिवर्तित करें?

  4. मेरा पसंदीदा पोस्टग्रेएसक्यूएल एक्सटेंशन - भाग दो

  5. रेल पर पोस्टग्रेज FATAL:डेटाबेस मौजूद नहीं है