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:你可能不知道的內容;


一、按時間統計:好比每五分鐘爲一個統計時間,
例子:查詢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



相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息