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

अपवाद के आधार पर विंडो फ़ंक्शन और समूह को पोस्टग्रेज़ करता है

आप नहीं हैं , वास्तव में, कुल कार्यों का उपयोग करना। आप विंडो फ़ंक्शन का उपयोग कर रहे हैं . इसलिए PostgreSQL sp.payout की मांग करता है और s.buyin GROUP BY . में शामिल होने के लिए खंड।

एक OVER जोड़कर क्लॉज, एग्रीगेट फंक्शन sum() एक विंडो फ़ंक्शन में बदल दिया जाता है, जो रखते . के दौरान प्रति विभाजन मानों को एकत्रित करता है सभी पंक्तियाँ।

आप विंडो के कार्यों और समग्र कार्यों को जोड़ सकते हैं . एकत्रीकरण पहले लागू होते हैं। मुझे आपके विवरण से समझ में नहीं आया कि आप प्रति ईवेंट एकाधिक भुगतान/खरीदार कैसे प्रबंधित करना चाहते हैं। एक अनुमान के रूप में, मैं प्रति घटना उनके योग की गणना करता हूं। अब मैं sp.payout को हटा सकता/सकती हूं और s.buyin GROUP BY . से खंड और प्रति player . के लिए एक पंक्ति प्राप्त करें और event :

SELECT p.name
     , e.event_id
     , e.date
     , sum(sum(sp.payout)) OVER w
     - sum(sum(s.buyin  )) OVER w AS "Profit/Loss" 
FROM   player            p
JOIN   result            r ON r.player_id     = p.player_id  
JOIN   game              g ON g.game_id       = r.game_id 
JOIN   event             e ON e.event_id      = g.event_id 
JOIN   structure         s ON s.structure_id  = g.structure_id 
JOIN   structure_payout sp ON sp.structure_id = g.structure_id
                          AND sp.position     = r.position
WHERE  p.player_id = 17 
GROUP  BY e.event_id
WINDOW w AS (ORDER BY e.date, e.event_id)
ORDER  BY e.date, e.event_id;

इस एक्सप्रेशन में:sum(sum(sp.payout)) OVER w , बाहरी sum() एक विंडो फ़ंक्शन है, आंतरिक sum() एक समग्र कार्य है।

मान लें कि p.player_id और e.event_id PRIMARY KEY हैं उनकी संबंधित तालिकाओं में।

मैंने e.event_id added जोड़ा ORDER BY WINDOW . का एक नियतात्मक क्रमबद्ध क्रम पर पहुंचने के लिए खंड। (एक ही तारीख में कई इवेंट हो सकते हैं।) event_id . भी शामिल है परिणाम में प्रति दिन कई घटनाओं में अंतर करने के लिए।

जबकि क्वेरी एक एकल . तक सीमित है प्लेयर (WHERE p.player_id = 17 ), हमें p.name . जोड़ने की आवश्यकता नहीं है या p.player_id करने के लिए GROUP BY और ORDER BY . यदि जॉइन में से कोई एक पंक्तियों को अनुचित रूप से गुणा करेगा, तो परिणामी योग गलत होगा (आंशिक रूप से या पूरी तरह से गुणा)। p.name . के आधार पर समूहीकरण तब क्वेरी की मरम्मत नहीं कर सका।

मैंने e.date . भी हटा दिया है GROUP BY . से खंड। प्राथमिक कुंजी e.event_id PostgreSQL 9.1 के बाद से इनपुट पंक्ति के सभी स्तंभों को शामिल करता है।

यदि आप एक साथ कई खिलाड़ियों को वापस करने के लिए क्वेरी बदलते हैं, अनुकूलित करें:

...
WHERE  p.player_id < 17  -- example - multiple players
GROUP  BY p.name, p.player_id, e.date, e.event_id  -- e.date and p.name redundant
WINDOW w AS (ORDER BY p.name, p.player_id, e.date, e.event_id)
ORDER  BY p.name, p.player_id, e.date, e.event_id;

जब तक p.name player_id . द्वारा अद्वितीय (?), समूह और क्रम परिभाषित किया गया है इसके अतिरिक्त एक नियतात्मक क्रम में सही परिणाम प्राप्त करने के लिए।

मैंने केवल e.date रखा है और p.name GROUP BY . में एक प्रदर्शन लाभ की उम्मीद करते हुए, सभी खंडों में समान क्रमबद्ध क्रम रखने के लिए। अन्यथा, आप वहां के कॉलम हटा सकते हैं। (बस e.date . के समान पहली क्वेरी में।)




  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. PostgreSQL:पूर्ण पाठ खोज - आंशिक शब्दों की खोज कैसे करें?

  3. संग्रहीत फ़ंक्शन या प्रक्रिया को कॉल करना सम्मिलित नहीं होगा और परिवर्तन जारी रखेगा

  4. मूल क्वेरी के लिए सरणी परम को बांधें

  5. पोस्टग्रेज जोंस कॉलम में नेस्टेड सरणियों को कैसे क्वेरी करें?