前段時間公司一個哥們為了偷懶,不願意用程序去處理統計信息,讓我寫一個按照時間段分組並計算分組內某個字段平均值與求和,一開始我沒怎么注意,覺得很簡單,就答應幫他寫,沒想到寫的時候無從下手,於是在網上找了一堆關於按照不同粒度在一段時間內分組解決辦法,有的說要自己定義函數,看了他寫的代碼,一眼掃過去,就懵逼了,完全看不懂,搞得我都懷疑人生了,是不是自己不是程序員啊,懷疑人生的同時還得繼續找啊,沒辦法,答應人家的事我得辦到啊,於是繼續找,找了大概一段時間,期間看到復雜的,直接pass,終於功夫不負有心人,找到一個代碼比較少的,仔細看了一下,感覺完全符合我的需求,根本不需要自定義函數,於是試了一下自己所用的表,居然實現了同事向我描述的功能,瞬間感覺這他媽so easy。現在總結一下,connect by 這個語法很強大,貼上代碼:
select d.p,t.crossing_no,count(t.crossing_no) from (select to_date('2018-06-22 19:00:00','yyyy-mm-dd hh24:mi:ss')-(level-1)*(5/60/24) p from dual connect by level<=(to_date('2018-06-22 19:00:00','yyyy-mm-dd hh24:mi:ss')-(to_date('2018-06-22 00:00:00','yyyy-mm-dd hh24:mi:ss')))*24*60/5+1) d left join t_detector_statis t
on t.start_time>d.p-5/60/24 and t.start_time<d.p
group by d.p,t.crossing_no
order by d.p desc
1.首先根據你傳入的起止時間利用connect by level 這個語法算出需要分組的時間段
select to_date('2018-06-22 19:00:00','yyyy-mm-dd hh24:mi:ss')-(level-1)*(5/60/24) p from dual connect by level<=(to_date('2018-06-22 19:00:00','yyyy-mm-dd hh24:mi:ss')-(to_date('2018-06-22 00:00:00','yyyy-mm-dd hh24:mi:ss')))*24*60/5+1
(to_date('2018-06-22 19:00:00','yyyy-mm-dd hh24:mi:ss')-(to_date('2018-06-22 00:00:00','yyyy-mm-dd hh24:mi:ss')))*24*60/5+1這個計算出按照5分鍾粒度划分多少段,即level最大值
to_date('2018-06-22 19:00:00','yyyy-mm-dd hh24:mi:ss')-(level-1)*(5/60/24)這個是根據level循環計算出時間段值
2.然后將分組后的時間段與你的業務邏輯表左連接
3.將左連接的結果,根據時間段分組,然后在組內進行分組函數計算。
