--- layout: default title: 用sql语句作简单的数据统计 category: tech ---
{{ page.title }}
曾经作过一段时间数据分析的工做,当时刚接手工做的时候,还想着学个专门作统计的工具;
后来发现一些简单统计,用数据库作就能够了,偶尔用awk来配合一下,或者excel来作个图就能搞定;
这里就简单来介绍下我用到的一些sql语句,用的是mysql数据库的语法;
Part 1:基础内容
首先一些sql自带的统计函数是必须的,count,sum,avg,max,min;
这些函数望文生义就能够了,都很简单;
另外基础的就是group by和order by;
所谓group by就是按组统计,通常配合上面的那几个望文生义的函数使用,若是分组内要加条件就用having;
下面的例子都基于这个表结构:
job表字段:server_id(int),id(int),jobresult(varchar255),dt(timestamp),status(int);
例子:
{% highlight java %} select server_id ,count(*)as num from job group by server_id order by num; {% endhighlight %}
这句sql的意思是,从job表中,查询每一个server有多少条记录,而且按照num从小到大排序;这个要本身试试才能真正体会。
Part2:你可能不知道的内容;
一、按时间统计:好比每五分钟为一个统计时间,
例子:查询2014年6月6日server_id为30的全部5分钟段内的记录数;
{% highlight java %} select HOUR(dt) AS h, FLOOR(MINUTE(dt) / 5) AS v,count(*) from job where server_id=30 and dt<"2014-06-06" and dt>"2014-06-05" group by h,v; {% endhighlight %}
聪明的你确定能明白这是什么意思,hour和minute都是取时间的函数,floor是取整;
二、按天统计;一个表里有n天的数据,统计天天的数据;
你只须要知道一个函数就能够了substr(dt,1,10) as t,这是取前10个字符即“xxxx-xx-xx”时间的前10个字符就是日期了;
若是有其余方法欢迎告知;
三、case when,多条件统计;
例子:统计全部server作任务的成功率(status=1成功)见下面;
{% highlight java %} select server_id,count(0) as job_num,100*sum(case when status=1 then 1 else 0 end)/count(0)as succ_rate from job group by server order by rate; {% endhighlight %}
这样一条语句就能够搞定,若是不这样写,你能够用多条语句来实现,就会麻烦不少;
Part3:一些小技巧:
一、建索引,若是想要查询速度快, 那就建索引;
ALTER TABLE `analyip`.`v2ip00` ADD UNIQUE `NewIndex1` (`tk`);
二、更新数据,根据两个表的条件来更新数据;
UPDATE v2ip01 a,tkip01 b SET b.v2ip=a.v2ip, b.sid=a.sid WHERE a.tk=b.tk;
三、distinct 不重复的,能够sum(distinct server_id)查询有多少不一样的server_id;
四、group_concat();
用select group_concat(id) from job limit 10; 输出是用逗号隔开的id;这样在作进一步操做时会更方便; 最后再不济写程序,shell脚本很容易实现;
{{ page.date | date_to_string }}java