版權聲明:本文為博主原創文章,遵循 CC 4.0 by-sa 版權協議,轉載請附上原文出處鏈接和本聲明。
mysql不同時間粒度下的分組統計
我們在做項目或者數據分析時,經常遇到這樣的需求:統計不同時間粒度下的數據分布情況,例如,每一天中每個小時網站的訪問量,某路口每半個小時通過的車輛數量等。對於此類的問題,一個sql簡單的查詢就能實現,故特此記錄下,方便以后使用。
在MySQL中,我的表為:track
數據結構如下所示:
按天統計
SELECT DATE(TimeStart) AS date, COUNT(*) AS num
FROM track
WHERE Flag = 0 AND Duration >= 300
GROUP BY date
ORDER BY date;
- 1
- 2
- 3
- 4
- 5
按小時統計
SELECT DATE_FORMAT(TimeStart, '%Y-%m-%d %H:00:00') AS time, COUNT(*) AS num
FROM track
WHERE Flag = 0 AND Duration >= 300
GROUP BY time
ORDER BY time;
- 1
- 2
- 3
- 4
- 5
結果如下:
按半小時統計
SELECT time, COUNT( * ) AS num
FROM
(
SELECT Duration,
DATE_FORMAT(
concat( date( TimeStart ), ' ', HOUR ( TimeStart ), ':', floor( MINUTE ( TimeStart ) / 30 ) * 30 ),
'%Y-%m-%d %H:%i'
) AS time
FROM tarck
WHERE Flag = 0 AND Duration >= 300
) a
GROUP BY DATE_FORMAT( time, '%Y-%m-%d %H:%i' )
ORDER BY time;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
結果如下:
按N分鍾統計
將上面的SQL語句稍微修改下,就可以實現按任意N分鍾為時間片的分組統計,如按10分鍾統計,先上代碼:
SELECT time, COUNT( * ) AS num
FROM
(
SELECT Duration,
DATE_FORMAT(
concat( date( TimeStart ), ' ', HOUR ( TimeStart ), ':', floor( MINUTE ( TimeStart ) / 10 ) * 10 ),
'%Y-%m-%d %H:%i'
) AS time
FROM tarck
WHERE Flag = 0 AND Duration >= 300
) a
GROUP BY DATE_FORMAT( time, '%Y-%m-%d %H:%i' )
ORDER BY time;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
基本思路:
將datetime類型的時間轉化為相應時間片的時間,例如將‘2017-03-01 01:08:19’ 轉化為‘2017-03-01 01:00:00’,然后group by即可。
按分鍾統計
將按小時統計的SQL語句稍微修改下,就可以實現按分鍾統計
SELECT DATE_FORMAT(TimeStart, '%Y-%m-%d %H:%i:00') AS time, COUNT(*) AS num
FROM track
WHERE Flag = 0 AND Duration >= 300
GROUP BY time
ORDER BY time;
- 1
- 2
- 3
- 4
- 5
DATE_FORMAT功能強大,可以根據format字符串格式化date值,參考下面鏈接
http://www.w3school.com.cn/sql/func_date_format.asp
參考博客:
- https://blog.csdn.net/kaka_buka/article/details/52614643
- https://blog.csdn.net/Beingccccc/article/details/78685490
</div>
<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-e44c3c0e64.css" rel="stylesheet">
</div>