日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql十分钟分组_MYSQL每隔10分钟进行分组统计的实现方法

發布時間:2025/3/19 数据库 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql十分钟分组_MYSQL每隔10分钟进行分组统计的实现方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

本文的內容主要是介紹了mysql每隔10分鐘進行分組統計的實現方法,在畫用戶登錄、操作情況在一天內的分布圖時會非常有用,之前我只知道用「存儲過程」實現的方法(雖然執行速度快,但真的是太不靈活了),后來學會了用高級點的「group by」方法來靈活實現類似功能。

正文:

-- time_str '2016-11-20 04:31:11'

-- date_str 20161120

select concat(left(date_format(time_str, '%y-%m-%d %h:%i'),15),'0') as time_flag, count(*) as count from `security`.`cmd_info` where `date_str`=20161120 group by time_flag order by time_flag; -- 127 rows

select round(unix_timestamp(time_str)/(10 * 60)) as timekey, count(*) from `security`.`cmd_info` where `date_str`=20161120 group by timekey order by timekey; -- 126 rows

-- 以上2個sql語句的思路類似——使用「group by」進行區分,但是方法有所不同,前者只能針對10分鐘(或1小時)級別,后者可以動態調整間隔大小,兩者效率差不多,可以根據實際情況選用

select concat(date(time_str),' ',hour(time_str),':',round(minute(time_str)/10,0)*10), count(*) from `security`.`cmd_info` where `date_str`=20161120 group by date(time_str), hour(time_str), round(minute(time_str)/10,0)*10; -- 145 rows

select concat(date(time_str),' ',hour(time_str),':',floor(minute(time_str)/10)*10), count(*) from `security`.`cmd_info` where `date_str`=20161120 group by date(time_str), hour(time_str), floor(minute(time_str)/10)*10; -- 127 rows (和 date_format 那個等價)

select concat(date(time_str),' ',hour(time_str),':',ceil(minute(time_str)/10)*10), count(*) from `security`.`cmd_info` where `date_str`=20161120 group by date(time_str), hour(time_str), ceil(minute(time_str)/10)*10; -- 151 rows

&

delimiter //

drop procedure if exists `usp_cmd_info`;

create procedure `usp_cmd_info`(in dates varchar(12))

begin

select count(*) from `cmd_info` where `time_str` between concat(dates, " 00:00:00") and concat(dates, " 00:10:00") into @count_0;

select count(*) from `cmd_info` where `time_str` between concat(dates, " 00:10:00") and concat(dates, " 00:20:00") into @count_1;

...

select count(*) from `cmd_info` where `time_str` between concat(dates, " 23:40:00") and concat(dates, " 23:50:00") into @count_142;

select count(*) from `cmd_info` where `time_str` between concat(dates, " 23:50:00") and concat(dates, " 23:59:59") into @count_143;

select @count_0, @count_1, @count_2, @count_3, @count_4, @count_5, @count_6, @count_7, @count_8, @count_9, @count_10, @count_11, @count_12, @count_13, @count_14, @count_15, @count_16, @count_17, @count_18, @count_19, @count_20, @count_21, @count_22, @count_23, @count_24, @count_25, @count_26, @count_27, @count_28, @count_29, @count_30, @count_31, @count_32, @count_33, @count_34, @count_35, @count_36, @count_37, @count_38, @count_39, @count_40, @count_41, @count_42, @count_43, @count_44, @count_45, @count_46, @count_47, @count_48, @count_49, @count_50, @count_51, @count_52, @count_53, @count_54, @count_55, @count_56, @count_57, @count_58, @count_59, @count_60, @count_61, @count_62, @count_63, @count_64, @count_65, @count_66, @count_67, @count_68, @count_69, @count_70, @count_71, @count_72, @count_73, @count_74, @count_75, @count_76, @count_77, @count_78, @count_79, @count_80, @count_81, @count_82, @count_83, @count_84, @count_85, @count_86, @count_87, @count_88, @count_89, @count_90, @count_91, @count_92, @count_93, @count_94, @count_95, @count_96, @count_97, @count_98, @count_99, @count_100, @count_101, @count_102, @count_103, @count_104, @count_105, @count_106, @count_107, @count_108, @count_109, @count_110, @count_111, @count_112, @count_113, @count_114, @count_115, @count_116, @count_117, @count_118, @count_119, @count_120, @count_121, @count_122, @count_123, @count_124, @count_125, @count_126, @count_127, @count_128, @count_129, @count_130, @count_131, @count_132, @count_133, @count_134, @count_135, @count_136, @count_137, @count_138, @count_139, @count_140, @count_141, @count_142, @count_143;

end //

delimiter ;

show procedure status\g

call usp_cmd_info("2016-10-20");

上面的這段mysql存儲過程的語句非常長,不可能用手工輸入,可以用下面的這段python代碼按所需的時間間隔自動生成:

import datetime

today = datetime.date.today()

# 或 由給定格式字符串轉換成

# today = datetime.datetime.strptime('2016-11-21', '%y-%m-%d')

min_today_time = datetime.datetime.combine(today, datetime.time.min) # 2016-11-21 00:00:00

max_today_time = datetime.datetime.combine(today, datetime.time.max) # 2016-11-21 23:59:59

sql_procedure_arr = []

sql_procedure_arr2 = []

for x in xrange(0, 60*24/5, 1):

start_datetime = min_today_time + datetime.timedelta(minutes = 5*x)

end_datetime = min_today_time + datetime.timedelta(minutes = 5*(x+1))

# print x, start_datetime.strftime("%y-%m-%d %h:%m:%s"), end_datetime.strftime("%y-%m-%d %h:%m:%s")

select_str = 'select count(*) from `cmd_info` where `time_str` between "{0}" and "{1}" into @count_{2};'.format(start_datetime, end_datetime, x)

# print select_str

sql_procedure_arr.append(select_str)

sql_procedure_arr2.append('@count_{0}'.format(x))

print '\n'.join(sql_procedure_arr)

print 'select {0};'.format(', '.join(sql_procedure_arr2))

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

希望與廣大網友互動??

點此進行留言吧!

總結

以上是生活随笔為你收集整理的mysql十分钟分组_MYSQL每隔10分钟进行分组统计的实现方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。