Oracle按日周月分組統計,及next_day()函數詳解

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;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章