2013-06-05 27 views
3

我有一個名爲「results」的表,其中包含大量行和名爲「timestamp」的列。按月對MySQL行進行分組並計數直到每個月

我想將每個月的行數分組。但對於其中的每一個,我也想考慮前幾個月的行。

所以,如果我有

Jun/13 
Jun/13 
Jun/13 
Jul/13 
Jul/13 
Jul/13 
Jul/13 
Jul/13 
Aug/13 
Aug/13 
Aug/13 
Aug/13 
Aug/13 
Aug/13 
Aug/13 

其結果將是

3 Jun/13 
8 Jul/13 
15 Aug/13 

這就是我現在所擁有的,但它並沒有考慮到前幾個月。

SELECT DATE_FORMAT(FROM_UNIXTIME(timestamp), '%e %b %Y'), COUNT(1) FROM results 
GROUP BY DATE_FORMAT(FROM_UNIXTIME(timestamp), '%e %b %Y'); 
+0

將COUNT(1)更改爲COUNT(*) –

回答

3

我得到這個工作:

SELECT month, count, @total:[email protected]+count AS total 
FROM (SELECT @total:=0) t STRAIGHT_JOIN 
    (SELECT DATE_FORMAT(FROM_UNIXTIME(timestamp), '%e %b %Y') AS month, COUNT(*) AS count 
    FROM results GROUP BY EXTRACT(YEAR_MONTH FROM FROM_UNIXTIME(timestamp))) AS m; 

+------------+-------+-------+ 
| month  | count | total | 
+------------+-------+-------+ 
| 1 Jun 2013 |  3 |  3 | 
| 1 Jul 2013 |  5 |  8 | 
| 1 Aug 2013 |  7 | 15 | 
+------------+-------+-------+ 
+0

完美!謝謝。 – vitorsdcs

+0

真棒回答,謝謝 – MOB

1

以下解決方案應該是工作...

SELECT COUNT(1),DATE_FORMAT(時間戳, '%B /%Y')FROM結果 GROUP BY YEAR(時間戳),月(時間戳);

好運

Talki

+0

結果與我發佈的查詢相同...它不考慮前幾個月 – vitorsdcs

0

如果我理解正確的話,這應該工作;

SELECT COUNT(*) num, SUBSTR(ts, 1, 7) month 
FROM results 
JOIN (SELECT MAX(timestamp) ts FROM results 
     GROUP BY YEAR(timestamp),Month(timestamp)) mm 
    ON results.timestamp <= mm.ts 
GROUP BY SUBSTR(ts, 1, 7); 

An SQLfiddle to test with