परिणाम प्राप्त करने के लिए सबक्वायरी के बिना , आपको उन्नत विंडो फ़ंक्शन ट्रिकरी का सहारा लेना होगा:
SELECT sum(count(*)) OVER () AS tickets_count
, sum(min(a.revenue)) OVER () AS atendees_revenue
FROM tickets t
JOIN attendees a ON a.id = t.attendee_id
GROUP BY t.attendee_id
LIMIT 1;
sqlfiddle
यह कैसे काम करता है?
इसे समझने की कुंजी है घटनाओं का क्रम क्वेरी में:
एग्रीगेट फ़ंक्शंस -> विंडो फ़ंक्शंस -> DISTINCT -> LIMIT
अधिक विवरण:
- LIMIT लागू होने से पहले परिणाम गणना प्राप्त करने का सबसे अच्छा तरीका
कदम दर कदम:
-
मैं
GROUP BY t.attendee_id- जो आप आम तौर पर एक सबक्वेरी में करते हैं। -
फिर मैं टिकटों की कुल संख्या प्राप्त करने के लिए गणना करता हूं। बहुत कुशल नहीं है, लेकिन आपकी आवश्यकता से मजबूर है। कुल कार्य
count(*)विंडो फ़ंक्शन में लपेटा गया हैsum( ... ) OVER ()गैर-सामान्य अभिव्यक्ति पर पहुंचने के लिए:sum(count(*)) OVER ()।और डुप्लीकेट के बिना राशि प्राप्त करने के लिए प्रति सहभागी न्यूनतम राजस्व का योग करें।
आप
max(). का भी उपयोग कर सकते हैं याavg()के बजायmin()revenue. के समान प्रभाव के लिए प्रति सहभागी की प्रत्येक पंक्ति के लिए समान होने की गारंटी है।यह आसान हो सकता है यदि
<ब्लॉककोट>DISTINCTविंडो फ़ंक्शंस में अनुमति दी गई थी, लेकिन PostgreSQL ने (अभी तक) इस सुविधा को लागू नहीं किया है। प्रति दस्तावेज़:सामान्य समग्र कार्यों के विपरीत, कुल विंडो फ़ंक्शन,
DISTINCT. की अनुमति नहीं देते हैं याORDER BYफ़ंक्शन तर्क सूची में उपयोग करने के लिए। -
अंतिम चरण एक पंक्ति प्राप्त करना है। यह
DISTINCT. के साथ किया जा सकता है (एसक्यूएल मानक) चूंकि सभी पंक्तियां समान हैं।LIMIT 1हालांकि तेज होगा। या SQL-मानक फ़ॉर्मFETCH FIRST 1 ROWS ONLY।