2014-06-06-sql-for-statistics
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2014-06-06-sql-for-statistics相关的知识,希望对你有一定的参考价值。
{{ 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:你可能不知道的内容;
1、按时间统计:比如每五分钟为一个统计时间,
例子:查询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是取整;
2、按天统计;一个表里有n天的数据,统计每天的数据;
你只需要知道一个函数就可以了substr(dt,1,10) as t,这是取前10个字符即“xxxx-xx-xx”时间的前10个字符就是日期了;
如果有其他方法欢迎告知;
3、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:一些小技巧:
1、建索引,如果想要查询速度快, 那就建索引;
ALTER TABLE `analyip`.`v2ip00` ADD UNIQUE `NewIndex1` (`tk`);
2、更新数据,根据两个表的条件来更新数据;
UPDATE v2ip01 a,tkip01 b SET b.v2ip=a.v2ip, b.sid=a.sid WHERE a.tk=b.tk;
3、distinct 不重复的,可以sum(distinct server_id)查询有多少不同的server_id;
4、group_concat();
用select group_concat(id) from job limit 10; 输出是用逗号隔开的id;这样在做进一步操作时会更方便; 最后再不济写程序,shell脚本很容易实现;
{{ page.date | date_to_string }}
以上是关于2014-06-06-sql-for-statistics的主要内容,如果未能解决你的问题,请参考以下文章