問題內容
- 今天遇到了一個需求,需求就是時間段為5分鍾的統計.有數據的時間戳.對成交單量進行統計.
想法思路
- 因為數據有時間戳,可以通過from_unixtime()來獲取具體的時間.
- 有了具體的時間,就可以用minute()函數獲取對應數據所在的分鍾.(minute()獲取到的分鍾為字符串,需要進行類型轉換cast())
- 那么怎么通過獲取到的minute來進行分組呢?
- 想法 00 - 05 應該分到一組, 05 - 10 應該分到第二組,依次類推.
- 用minute 整除 5 的話, 00 - 05 整除 5 都為 0, 05 - 10 整除 5 都為1,依次類推
- 這樣就可以把每5分鍾的數據都分到了一組.
- 注意,hive中的 minute / 5 的話並能整除,所以需要函數向下取整,用floor()函數來完成.
- 雖然把分鍾分開了,但是並不能僅僅按照分鍾來分組,這樣就把每個小時的相同分組分成一組,所以每個小時之間也是一個聚合維度.
具體步驟
- 先通過時間戳取到數據對應的小時和分鍾.
- 小時 from_unixtime(time,'yyyyMMdd HH')
- 分鍾 minute(from_unixtime(time))
- 對分鍾進行整除5來完成分段.(同時需要對獲取到的minute進行類型轉換)
- floor(cast(minute(from_unixtime(time)) as int) / 5)
- 如果要是變時間段的話,分鍾為單位,除以相應的時間段就行.10分鍾就整除10,15分鍾就整除15.
- 對小時和(分鍾整除的結果)進行分組進行統計.
示例SQL
select
case
when sort in (0,1) then concat(substring(time,10,11),':0',sort*5)
else concat(substring(time,10,11),':',sort*5)
end, --對時間格式進程處理,把小時和分鍾合並 例如,hour =2018111 00,sort = 1 -> 00:05
num --統計的字段
from(
select time,sort,count(distinct purchase_id) as num --統計
from
(
select purchase_id,--需要統計的字段
from_unixtime(add_time,'yyyyMMdd HH') as time, --取小時
floor(cast(minute(from_unixtime(add_time)) as int) / 5 ) as sort --按分鍾歸類
from kkgoo.kk_order_association
where from_unixtime(add_time,'yyyyMMdd') = 20181111 --篩選條件
and status not in ('unpayed', 'close', 'timeout_pay', 'timeout_lock')
) t
group by 1,2 --對小時和分鍾整除結果進行分組
) t;