關於oracle按日周月分組統計以及next_day()函數詳解


 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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM