MySQL में यूज़र-डिफ़ाइंड वेरिएबल से रनिंग टोटल (संचित योग) निकालना
MySQL 8.0 से पहले विंडो फ़ंक्शन (SUM() OVER) नहीं थे, इसलिए यूज़र-डिफ़ाइंड वेरिएबल (@var) का उपयोग करके संचित योग निकाला जाता है।
टेबल और डेटा
CREATE TABLE accumulatedDemo (Value INT); INSERT INTO accumulatedDemo VALUES (10), (15), (20), (25), (45);
क्वेरी: यूज़र वेरिएबल के साथ
SET @previousSum = 0; SELECT Value, @previousSum := @previousSum + Value AS AccumulatedColumn FROM accumulatedDemo;
आउटपुट
+-------+-------------------+ | Value | AccumulatedColumn | +-------+-------------------+ | 10 | 10 | | 15 | 25 | | 20 | 45 | | 25 | 70 | | 45 | 115 | +-------+-------------------+
MySQL 8.0+ में विंडो फ़ंक्शन (अनुशंसित)
SELECT Value,
SUM(Value) OVER (ORDER BY (SELECT NULL) ROWS UNBOUNDED PRECEDING) AS AccumulatedColumn
FROM accumulatedDemo;
(SELECT NULL) क्रम को अपरिभाषित रखता है (इन्सर्शन ऑर्डर)। यदि कोई क्रम कॉलम है (जैसे id), तो ORDER BY id उपयोग करें।
तुलना
- वेरिएबल विधि: पुराने संस्करणों में काम करती है, लेकिन क्रम की गारंटी नहीं देती जब तक
ORDER BYन हो। - विंडो फ़ंक्शन: मानक SQL, पठनीय, ऑप्टिमाइज़र फ्रेंडली, समानांतर निष्पादन सुरक्षित।
चेतावनी
यूज़र वेरिएबल विधि में ORDER BY के बिना परिणाम अप्रत्याशित हो सकते हैं। हमेशा स्पष्ट क्रम निर्दिष्ट करें।