आप नहीं हैं , वास्तव में, कुल कार्यों का उपयोग करना। आप विंडो फ़ंक्शन का उपयोग कर रहे हैं . इसलिए 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 . के समान पहली क्वेरी में।)