1、概述
工作中遇到如下問題:統計周期內關鍵詞數,而這里的周期內最常用的就是日周月,日月比較容易處理,
周的話可以通過next_day()函數實現。
2、實例問題
日下,有一張表lij_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;