[數據庫] SQL特定查詢場景之時間段切分方法

1 序言

大數據項目、數據分析場景中,Query API/SQL經常遇到需要切分時段的需求。
如下是一些項目上的經驗總結。

2 實時數倉即席查詢場景的解決方法

2.1 函數拼接法

  • 方法特點:
  • 時間數據以時間戳形式存儲在數據庫,而非以時間字符串
  • 查詢時實時運算時間段

基於此,支持根據終端用戶所處位置/時區的不同,而實時計算時間段

  • 數據量大、或併發量大時,需考慮數據庫的計算資源(CPU、內存)是否充裕
  • 案例1

以Clickhouse爲例 / eg. timeZone = Aisa/Shanghai

concat( toString(toHour(create_time , '{{timeZone}}')) , ':' , toString( FLOOR( toMinute(create_time , '{{timeZone}}') / 30 ) * 30 ) ) as time_period -- eg. '8:0' / '18:30'

  • 案例2

以 Clickhouse 爲例 / eg. timeZone = Aisa/Shanghai

formatDateTime(
	addMinutes(
		toDate(alarm_recent_time, '{{timeZone}}'),
		floor(
			dateDiff('minute', toDate(alarm_recent_time, '{{timeZone}}') , toDateTime(alarm_recent_time, '{{timeZone}}')) / 30 ,
			0
		) * 30
	)
	, '%H:%M'
) as timePeriod

2.2 查詢SQL按不同情況手動分隔時間段

  • 方法特點
  • 時間以時間戳形式存儲在數據庫
  • 不建議/不適用於需要分幾十上百個時段的情況(SQL會非常冗長、易錯)
  • 案例

以 Clickhouse 爲例

...

(case
	when driverTime >= 0 and driverTime < 1800 then '0.0h-0.5h' -- 駕駛時長(單位:秒) := D 檔信號個數 * tsp.vehicle_status_upload_frequency(30s)
	when driverTime >= 1800 and driverTime < 3600 then '0.5h-1.0h'
	when driverTime >= 3600 and driverTime < 7200 then '1.0h-2.0h'
	when driverTime >= 7200 and driverTime < 10800 then '2.0h-3.0h'
	when driverTime >= 10800 and driverTime < 14400 then '3.0h-4.0h'
	when driverTime >= 14400 and driverTime < 21600 then '4.0h-6.0h'
	else '≥6.0h'
END) as drivingTimePeriod

...
UNION ALL

(
	select '0.0h-0.5h' as drivingTimePeriod, 0 as vehicleCount
	union all
	select '0.5h-1.0h' as drivingTimePeriod, 0 as vehicleCount
	union all
	select '1.0h-2.0h' as drivingTimePeriod, 0 as vehicleCount
	union all
	select '2.0h-3.0h' as drivingTimePeriod, 0 as vehicleCount
	union all
	select '3.0h-4.0h' as drivingTimePeriod, 0 as vehicleCount
	union all
	select '4.0h-6.0h' as drivingTimePeriod, 0 as vehicleCount
	union all
	select '≥6.0h' as drivingTimePeriod, 0 as vehicleCount
)

...

2.3 寫入數據庫時即存儲時段字段(timePeriod)

  • 方法特點
  • 不適用於分不同時區查詢/分析數據的情況

因爲寫入的時段字段是某一個固定的時區,無法在查詢時根據不同時區進行查詢

3 離線數倉離線查詢場景的解決方法

TODO

X 參考文獻

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