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