सबक्वेरी के साथ क्यूमुलेटिव सम फ़िल्टरिंग
कॉलम मानों का क्यूमुलेटिव सम (रनिंग टोटल) एक सीमा से कम होने वाली पंक्तियों को चुनने के लिए सहसंबद्ध सबक्वेरी का उपयोग करें।
उदाहरण: टेबल बनाना और डेटा इन्सर्ट करना
mysql> CREATE TABLE DemoTable844(
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Amount INT
);
Query OK, 0 rows affected (0.95 sec)
रिकॉर्ड्स इन्सर्ट करना
mysql> INSERT INTO DemoTable844(Amount) VALUES(80),(100),(60),(40),(150),(24); Query OK, 6 rows affected (...)
सभी रिकॉर्ड्स देखना
mysql> SELECT * FROM DemoTable844;
+----+--------+ | Id | Amount | +----+--------+ | 1 | 80 | | 2 | 100 | | 3 | 60 | | 4 | 40 | | 5 | 150 | | 6 | 24 | +----+--------+ 6 rows in set (0.00 sec)
क्यूमुलेटिव सम < 150 वाली पंक्तियों की क्वेरी
mysql> SELECT * FROM DemoTable844 tbl
WHERE (SELECT SUM(Amount) FROM DemoTable844 WHERE Amount <= tbl.Amount ORDER BY Amount) < 150
ORDER BY Id;
परिणाम
+----+--------+ | Id | Amount | +----+--------+ | 3 | 60 | | 4 | 40 | | 6 | 24 | +----+--------+ 3 rows in set (0.26 sec)
क्वेरी व्याख्या
- बाहरी क्वेरी:
tblएलियास के साथ प्रत्येक रो के लिए - सबक्वेरी:
WHERE Amount <= tbl.Amount- वर्तमान रो के मान से कम या बराबर सभी मानों का योग ORDER BY Amount- क्यूमुलेटिव सम के लिए क्रम सुनिश्चित करता है< 150- केवल वे रो जहां क्यूमुलेटिव सम 150 से कम है
तर्क समझना
Amount के आरोही क्रम में: 24, 40, 60, 80, 100, 150
- 24: सम = 24 (< 150) ✓
- 40: सम = 24+40 = 64 (< 150) ✓
- 60: सम = 64+60 = 124 (< 150) ✓
- 80: सम = 124+80 = 204 (≥ 150) ✗
- 100: सम = 204+100 = 304 (≥ 150) ✗
- 150: सम = 304+150 = 454 (≥ 150) ✗
परिणाम: 24, 40, 60 वाली पंक्तियां (Id: 6, 4, 3)
बेहतर तरीका: विंडो फंक्शन (MySQL 8.0+)
SELECT Id, Amount FROM (
SELECT Id, Amount,
SUM(Amount) OVER (ORDER BY Amount ROWS UNBOUNDED PRECEDING) AS CumulativeSum
FROM DemoTable844
) t WHERE CumulativeSum < 150
ORDER BY Id;
लाभ विंडो फंक्शन के
- अधिक पठनीय और रखरखाव योग्य
- बेहतर प्रदर्शन (सिंगल पास)
- मानक SQL अनुपालन
- पार्टीशनिंग सपोर्ट
उपयोग के मामले
- बजट सीमा के भीतर आइटम चुनना
- क्यूमुलेटिव कोटा/सीमा लागू करना
- समय-आधारित संचय सीमाएं