मेरा लक्ष्य तारीख तक पंजीकृत उपयोगकर्ताओं की संख्या को कम करना है
यहाँ मेरा mysql sql है
SELECT MONTH( DATE ) AS `month`, COUNT(userid)
FROM `stats`
WHERE `userid` = 1
GROUP BY `month`
यह मुझे प्रति माह उपयोगकर्ताओं की संख्या देता है, लेकिन उन्हें कम नहीं करता है
परिणाम:
month 1 : 90
month 2 : 50 (it should be 90 + 50)
month 3 : 10 (it should be 90 + 50 + 10)
मैंने कोशिश की:
SELECT month,
SUM( CNT ) AS CUM_CNT_TILL_NOW
FROM (
SELECT MONTH( DATE ) AS `month`, COUNT(userid) AS CNT
FROM `stats`
WHERE `userid` = 1
GROUP BY `month`
);
और त्रुटि मिली: # 1248 - प्रत्येक व्युत्पन्न तालिका का अपना उपनाम होना चाहिए
उत्तर:
जवाब के लिए 2 № 1MySQL में, संचयी योग करने के लिए मूल रूप से तीन तरीके हैं:
- एक सहसंबद्ध उपशम।
- असमानता एकत्रीकरण के साथ जुड़ती है।
- चर।
उत्तरार्द्ध सबसे सरल है। हालांकि, इस तरह से group by
MySQL में काम करता है, अक्सर आपको एक सबक्वेरी की आवश्यकता होती है:
SELECT yyyy, mm, cnt,
(@sum := @sum + cnt) as cume_sum
FROM (SELECT YEAR(DATE) as yyyy, MONTH( DATE ) AS mm, COUNT(userid) AS CNT
FROM stats
WHERE userid = 1
GROUP BY yyyy, mm
) ym CROSS JOIN
(SELECT @sum := 0) params
ORDER BY yyyy, mm;
टिप्पणियाँ:
- यह समझदारी से वर्ष को ध्यान में रखता है। यह आमतौर पर तब होता है जब आप महीने के हिसाब से जमा होते हैं।
- The
@sum
चर क्वेरी में परिभाषित किया गया है । यह एक सुविधा है । - उप-क्वेरी की आवश्यकता है क्योंकि कई बार चर एग्रीगेटर के साथ अपेक्षा के अनुरूप काम नहीं करते ।
- उप-क्वेरी एक उपनाम है ।
जवाब के लिए 0 № 2
Mysql में, आप सत्र चर का उपयोग कर सकते हैं । नीचे की तरह:
SET @sum = 0;
SELECT MONTH( DATE ) AS `month`, @sum:=@sum+COUNT(userid) as sum
FROM `stats`
WHERE `userid` = 1
GROUP BY `month`;
या फिर, आप दो तालिकाओं में शामिल होने के लिए होगा, लेकिन वह अक्षम हो जाएगा ।
जवाब के लिए 0 № 3
SELECT month,
SUM( CNT ) OVER ( ORDER BY month ROWS BETWEEN UNBOUNDED PRECEEDING
AND CURRENT ROW
) AS CUM_CNT_TILL_NOW
FROM
(
SELECT MONTH( DATE ) AS `month`, COUNT(userid) AS CNT
FROM `stats`
WHERE `userid` = 1
GROUP BY `month`
);
एक अंय समाधान:-
WITH tmp AS
(
SELECT MONTH( DATE ) AS `month`, COUNT(userid) AS CNT
FROM `stats`
WHERE `userid` = 1
GROUP BY `month`
)
SELECT o.month, o.cnt , RunningTotal = o.cnt + COALESCE(
(
SELECT SUM(cnt) AS cnt
FROM tmp i
WHERE i.month < o.month), 0
)
FROM tmp AS o
ORDER BY o.month;
जवाब के लिए 0 № 4
कुछ इस तरह के साथ की कोशिश करो:
SELECT MONTH(DATE) AS `month`, COUNT(userid) , (SELECT COUNT(userid)
FROM `stats`
WHERE `userid` = 1 AND MONTH(date) <= MONTH(s.date))
FROM `stats` s
WHERE `userid` = 1
GROUP BY `month`
सुधार के लिए धंयवाद jpw