您的位置:首页 > 数据库

2014-06-06-sql-for-statistics

2016-02-15 13:33 363 查看
2014-06-06-sql-for-statistics---
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:你可能不知道的内容;

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 }}

来自为知笔记(Wiz)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: