1.概述
工作中遇到如下問題:統計週期內關鍵詞數,而這裏的週期內最常用的就是日周月。
日月比較容易處理,周的話可以通過next_day()函數實現。
2.實例問題
如下,有一張表ljb_test,包括兩個字段:test_time DATE,city varchar2(4)。
下面我想統計,不同週期範圍內的不同城市的記錄總數。這裏的不同週期爲日周月。
該問題的核心就是處理日期時間,即如何讓同一週期範圍內的時間返回同一個值,且該值是唯一的。
如下,每個期間將會提供兩種方式,需要指出的是,trunc()函數總是效率高。
2.1按照日統計
--效率高
select trunc(test_time,'DD') time,count(1) ct
from ljb_test
group by trunc(test_time,'DD')
order by time;
或者
select to_char(test_time,'YYYYMMDD') time,count(1) ct
from ljb_test
group by to_char(test_time,'YYYYMMDD')
order by time;
以此類推按照小時統計,把時間處理爲
trunc(test_time,’HH24’)
或者
to_char(test_time,’YYYYMMDD HH24’)
2.2按照周統計
按照周統計問題的核心,就是如何讓同一周的時間返回同一值。
Oracle提供了一個函數next_day()
next_day(date,n):計算date時間後下一個星期幾的時間。n可以傳遞字符串,如’星期一’,’monday’。還可以傳遞數值,1代表週日。
因爲語言問題,這裏推薦使用數字試下。
有這個函數,就可以實現了。
只需要對日期做如下處理:
trunc(next_day(test_time-7,2),’DD’)
其實trunc()函數可以直接實現返回週一。
trunc(test_time,’iw’)
之所以介紹next_day()函數,如果我們傳入的日期字段是varchar2類型的,那麼兩種方式簡易成都一樣。
如下,把完成的SQL寫出:
--效率高
select trunc(test_time,'iw') time, count(1) ct
from ljb_test
group by trunc(test_time,'iw')
order by time;
或者
select trunc(next_day(test_time-7,2),'DD') time ,count(1) ct
from ljb_test
group by trunc(next_day(test_time-7,2),'DD')
order by time;
2.3按月統計
按月統計和按天統計一樣
--效率高
select trunc(test_time,'MM') time,count(1) ct
from ljb_test
group by trunc(test_time,'MM')
order by time;
或者select to_char(test_time,'YYYYMM') time,count(1) ct
from ljb_test
group by to_char(test_time,'YYYYMM')
order by time;