1、日期類函數
1.1 時間日期函數
toHour() → 獲取時間日期的小時
toMinute() → 獲取時間日期的分鍾
toSecond() → 獲取時間日期的秒
toTime() → 將時間日期的日期固定到某一天,保留原始時間
SELECT
toHour(now()),
toMinute(now()),
toSecond(now()),
toTime(now())
┌─toHour(now())─┬─toMinute(now())─┬─toSecond(now())─┬───────toTime(now())─┐
│ 11 │ 37 │ 14 │ 1970-01-02 11:37:14 │
└───────────────┴─────────────────┴─────────────────┴─────────────────────┘
toDayOfMonth → 獲取日期或時間日期的天(1-31)
toDayOfWeek → 獲取日期或時間日期的星期數值(1-7)
toYear → 獲取日期或時間日期的年份
toMonth → 取日期或時間日期的月份
SELECT
toDayOfMonth(now()),
toDayOfWeek(now()),
toYear(now()),
toMonth(now()),
now()
┌─toDayOfMonth(now())─┬─toDayOfWeek(now())─┬─toYear(now())─┬─toMonth(now())─┬───────────────now()─┐
│ 26 │ 4 │ 2020 │ 11 │ 2020-11-26 11:33:49 │
└─────────────────────┴────────────────────┴───────────────┴────────────────┴─────────────────────┘
toDate() → 將字符日期或時間戳轉化為日期
toDateTime() → 將字符時間戳轉化為時間戳
SELECT
toDate('2020-11-25 19:58:10'),
toDateTime('2020-11-25 19:58:10')
┌─toDate('2020-11-25 19:58:10')─┬─toDateTime('2020-11-25 19:58:10')─┐
│ 2020-11-25 │ 2020-11-25 19:58:10 │
└───────────────────────────────┴───────────────────────────────────┘
1.2 生成日期、時間戳
now() → 生成當前時間戳
today() → 生成當前日期
yesterday() → 生成當前日期的前一天
SELECT
now(),today(),yesterday()
┌───────────────now()─┬────today()─┬─yesterday()─┐
│ 2020-11-25 19:58:10 │ 2020-11-25 │ 2020-11-24 │
└─────────────────────┴────────────┴─────────────┘
2、類型轉化函數
toDecimal32() → 將數值型或者含有非數字的字符串進行精度保留
toInt8OrZero() → 將整數字符型轉化為整數型,否則返回0
toFloat32OrZero() → 將數值字符串型轉化為數值型
SELECT
toDecimal32(83.5222191, 6),
toDecimal32('-23.12291', 3),
toInt8OrZero('23'),
toInt8OrZero('-123'),
toFloat32OrZero('-123'),
toFloat32OrZero('123.123')
┌─toDecimal32(83.5222191, 6)─┬─toDecimal32('-23.12291', 3)─┬─toInt8OrZero('23')─┬─toInt8OrZero('-123')─┬─toFloat32OrZero('-123')─┬─toFloat32OrZero('123.123')─┐
│ 83.522219 │ -23.122 │ 23 │ -123 │ -123 │ 123.123 │
└────────────────────────────┴─────────────────────────────┴────────────────────┴──────────────────────┴─────────────────────────┴────────────────────────────┘
3.字符串處理
upper() → 大寫轉換
lower() → 小寫轉換
concat() → 字符串拼接
substring() → 字符串截取
splitByString() → 字符串拆分
SELECT
upper('abc'),
lower('ABC'),
concat('ab', 'cd'),
substring('abcde', 1, 2),
splitByString(',', 'a,b,c')
┌─upper('abc')─┬─lower('ABC')─┬─concat('ab', 'cd')─┬─substring('abcde', 1, 2)─┬─splitByString(',', 'a,b,c')─┐
│ ABC │ abc │ abcd │ ab │ ['a','b','c'] │
└──────────────┴──────────────┴────────────────────┴──────────────────────────┴─────────────────────────────┘
4.取整函數(四舍五入)
floor([x, N]) → 向下取數
ceil([x, N]) → 向上取數
round([x, N]) → 四舍五入
SELECT
floor(123.883, 1),floor(123.883, -1),
ceil(123.883, 1),ceil(123.883, -1),
round(123.883, 1),round(123.883, -1)
┌─floor(123.883, 1)─┬─floor(123.883, -1)─┬─ceil(123.883, 1)─┬─ceil(123.883, -1)─┬─round(123.883, 1)─┬─round(123.883, -1)─┐
│ 123.8 │ 120 │ 123.9 │ 130 │ 123.9 │ 120 │
└───────────────────┴────────────────────┴──────────────────┴───────────────────┴───────────────────┴────────────────────┘
5.NULL值處理函數
isNull() → 檢查參數是否為NULL ,為NULL返回1,否則0
isNotNull() → 檢查參數是否不為 NULL,為NULL返回0,否則1
ifNull() → 如果第一個參數為NULL,則返回第二個參數的值。
NullIf() → 如果參數相等,返回NULL,參數不相等,返回第一個值
SELECT
isNull('1'),isNull(NULL),
isNotNull('1'),isNotNull(NULL),
ifNull(NULL, 2),ifNull(1, 2),
NullIf(1, 1),NullIf(1, 0)
┌─isNull('1')─┬─isNull(NULL)─┬─isNotNull('1')─┬─isNotNull(NULL)─┬─ifNull(NULL, 2)─┬─ifNull(1, 2)─┬─NullIf(1, 1)─┬─NullIf(1, 0)─┐
│ 0 │ 1 │ 1 │ 0 │ 2 │ 1 │ ᴺᵁᴸᴸ │ 1 │
└─────────────┴──────────────┴────────────────┴─────────────────┴─────────────────┴──────────────┴──────────────┴──────────────┘
6.取記錄最新一條或最早一條
argMin(arg,val) → 計算最小值的arg值。如果val的最小值有幾個不同的arg值,則遇到的第一個值是輸出。
argMax(arg,val) → 計算最大值的arg值。如果存在多個不同的arg值來表示val的最大值,則遇到的第一個值是輸出。
# 測試數據,求最低薪水的員工
┌─user─────┬─salary─┐
│ director │ 5000 │
│ manager │ 3000 │
│ worker │ 1000 │
└──────────┴────────┘
# 計算最低薪水的員工
SELECT argMin(user, salary) FROM salary
┌─argMin(user, salary)─┐
│ worker │
└──────────────────────┘
7.數組函數
1.arrayJoin
- 將數組行變列
SELECT arrayJoin([2, 5, 7, 8, 9]) AS arrayJoin
┌─arrayJoin─┐
│ 2 │
│ 5 │
│ 7 │
│ 8 │
│ 9 │
└───────────┘
2.arraySort(升序),arrayReverseSort(降序)
- 對數組進行排序
SELECT arrayJoin(arrayReverseSort([2, 5, 7, 8, 9])) AS arrayReverseSort
┌─arrayReverseSort─┐
│ 9 │
│ 8 │
│ 7 │
│ 5 │
│ 2 │
└──────────────────┘
3.arrayFilter
- 過濾出數組中滿足條件的數據
#過濾獲取大於6的數值
SELECT arrayJoin(arrayFilter(x -> (x > 6), [2, 5, 7, 8, 9])) AS arrayFilter
┌─arrayFilter─┐
│ 7 │
│ 8 │
│ 9 │
└─────────────┘
4.arrayEnumerate
- 返回數據的下標
SELECT arrayEnumerate([2, 5, 7, 8, 9]) AS arrayEnumerate
┌─arrayEnumerate─┐
│ [1,2,3,4,5] │
└────────────────┘
5.arrayReduce
- 對數組進行聚合操作,min 、max、avg 、sum、count
SELECT arrayReduce('sum', [2, 5, 7, 8, 9]) AS arrayReduce
┌─arrayReduce─┐
│ 31 │
└─────────────┘
6.hasAny(包含某個值),hasAll(包含全部值)
- 判斷數組中是否包含某些值,包含返回1,否則返回0
SELECT
hasAny([2, 5, 7, 8, 9], [6, 9]) AS hasAny,
hasAll([2, 5, 7, 8, 9], [6, 9]) AS hasAll
┌─hasAny─┬─hasAll─┐
│ 1 │ 0 │
└────────┴────────┘
7.arrayDistinct
- 對數組進行去重
SELECT arrayDistinct([2, 2, 4, 4, 5, 7, 8, 9]) AS arrayDistinct
┌─arrayDistinct─┐
│ [2,4,5,7,8,9] │
└───────────────┘
8 位圖函數
位圖函數用於對兩個位圖對象進行計算,對於任何一個位圖函數,它都將返回一個位圖對象,例如and,or,xor,not等。位圖對象有兩種構造方法。一個是由聚合函數groupBitmapState構造的,另一個是由Array Object構造的。同時還可以將位圖對象轉化為數組對象。我們使用RoaringBitmap實際存儲位圖對象,當基數小於或等於32時,它使用Set保存。當基數大於32時,它使用RoaringBitmap保存。這也是為什么低基數集的存儲更快的原因。
8.1 位圖的構建與轉化
- bitmapBuild → 將無符號整數數組構建位圖對象。
- bitmapToArray → 將位圖轉換為整數數組。
- bitmapSubsetInRange → 將位圖指定范圍(不包含range_end)轉換為另一個位圖。
# 語法格式:bitmap – 位圖對象,range_start – 范圍起始點(含),range_end – 范圍結束點(不含)
bitmapSubsetInRange(bitmap, range_start, range_end)
- bitmapSubsetLimit → 將位圖指定范圍(起始點和數目上限)轉換為另一個位圖。
# 語法格式:bitmap – 位圖對象,range_start – 范圍起始點(含),limit – 子位圖基數上限
bitmapSubsetLimit(bitmap, range_start, limit)
測試:
WITH [toUInt32(1), toUInt32(2), toUInt32(5), toUInt32(7), toUInt32(35)] AS arr
SELECT
bitmapBuild(arr) AS bitmapBuild,
bitmapToArray(bitmapBuild(arr)) AS bitmapToArray,
bitmapToArray(bitmapSubsetInRange(bitmapBuild(arr), toUInt32(2), toUInt32(7))) AS bitmapSubsetInRange,
bitmapToArray(bitmapSubsetLimit(bitmapBuild(arr), toUInt32(2), toUInt32(7))) AS bitmapSubsetLimit
┌─bitmapBuild─┬─bitmapToArray─┬─bitmapSubsetInRange─┬─bitmapSubsetLimit─┐
│ # │ [1,2,5,7,35] │ [2,5] │ [2,5,7,35] │
└─────────────┴───────────────┴─────────────────────┴───────────────────┘
- arrayJoin → 將數組轉化為明細數據,行轉列
測試:
SELECT arrayJoin(bitmapToArray(bitmapBuild([1, 2, 3, 4, 5]))) AS uid
┌─uid─┐
│ 1 │
│ 2 │
│ 3 │
│ 4 │
│ 5 │
└─────┘
- groupBitmapState → 聚合函數,可將id列值壓縮bitmap
測試:
SELECT bitmapToArray(groupBitmapState(arrayJoin([1, 2, 3, 4, 5]))) AS groupBitmapState
┌─groupBitmapState─┐
│ [1,2,3,4,5] │
└──────────────────┘
8.2 位圖的計算操作
- bitmapHasAny(bitmap1,bitmap2) → 如果位圖有任何公共元素則返回1,否則返回0。對於空位圖,返回0。
- bitmapHasAll(bitmap1,bitmap2) → 如果第一個位圖包含第二個位圖的所有元素,則返回1,否則返回0。如果第二個參數是空位圖,則返回1。
測試:
# 語法格式
WITH
bitmapBuild([toUInt32(1), toUInt32(2), toUInt32(3), toUInt32(4), toUInt32(5)]) AS bitmap1,
bitmapBuild([toUInt32(4), toUInt32(5), toUInt32(9), toUInt32(17), toUInt32(35)]) AS bitmap2
SELECT
bitmapHasAny(bitmap1, bitmap2) AS bitmapHasAny,
bitmapHasAll(bitmap1, bitmap2) AS bitmapHasAll
┌─bitmapHasAny─┬─bitmapHasAll─┐
│ 1 │ 0 │
└──────────────┴──────────────┘
- bitmapContains(bitmap, needle) → 檢查位圖是否包含指定元素。
- bitmapAnd(bitmap1,bitmap2) → 兩個位圖對象進行與操作(相當於取交集),返回一個新的位圖對象。
- bitmapOr(bitmap1,bitmap2) → 為兩個位圖對象進行或操作,返回一個新的位圖對象,如果參數是多個的情況下,可以嘗試使用groupBitmapMergeState。
- bitmapXor(bitmap1,bitmap2) → 為兩個位圖對象進行異或操作,返回一個新的位圖對象。
- bitmapAndnot(bitmap1,bitmap2) → 計算兩個位圖的差異,返回一個新的位圖對象。
測試:
WITH
bitmapBuild([toUInt32(1), toUInt32(2), toUInt32(3), toUInt32(4), toUInt32(5)]) AS bitmap1,
bitmapBuild([toUInt32(4), toUInt32(5), toUInt32(9), toUInt32(17), toUInt32(35)]) AS bitmap2
SELECT
bitmapContains(bitmap1, toUInt32(5)) AS bitmapContains,
bitmapToArray(bitmapAnd(bitmap1, bitmap2)) AS bitmapAnd,
bitmapToArray(bitmapOr(bitmap1, bitmap2)) AS bitmapOr,
bitmapToArray(bitmapXor(bitmap1, bitmap2)) AS bitmapXor,
bitmapToArray(bitmapAndnot(bitmap1, bitmap2)) AS bitmapAndnot
┌─bitmapContains─┬─bitmapAnd─┬─bitmapOr────────────┬─bitmapXor───────┬─bitmapAndnot─┐
│ 1 │ [4,5] │ [1,2,3,4,5,9,17,35] │ [1,2,3,9,17,35] │ [1,2,3] │
└────────────────┴───────────┴─────────────────────┴─────────────────┴──────────────┘
- bitmapCardinality(bitmap) → 返回一個UInt64類型的數值,表示位圖的大小。
- bitmapMin(bitmap) → 返回一個UInt64類型的數值,表示位圖中的最小值。如果位圖為空則返回UINT32_MAX。
- bitmapMax(bitmap) → 返回一個UInt64類型的數值,表示位圖中的最大值。如果位圖為空則返回0。
測試:
WITH bitmapBuild([toUInt32(4), toUInt32(5), toUInt32(9), toUInt32(17), toUInt32(35)]) AS bitmap
SELECT
bitmapCardinality(bitmap) AS bitmapCardinality,
bitmapMin(bitmap) AS bitmapMin,
bitmapMax(bitmap) AS bitmapMax
┌─bitmapCardinality─┬─bitmapMin─┬─bitmapMax─┐
│ 5 │ 4 │ 35 │
└───────────────────┴───────────┴───────────┘
- bitmapOrCardinality(bitmap1,bitmap2) → 為兩個位圖進行或運算,返回結果位圖的基數。
- bitmapXorCardinality(bitmap1,bitmap2) → 為兩個位圖進行異或運算,返回結果位圖的基數。
- bitmapAndnotCardinality(bitmap1,bitmap2) → 計算兩個位圖的差異,返回結果位圖的基數。
測試:
WITH
bitmapBuild([toUInt32(1), toUInt32(2), toUInt32(3), toUInt32(4), toUInt32(5)]) AS bitmap1,
bitmapBuild([toUInt32(4), toUInt32(5), toUInt32(9), toUInt32(17), toUInt32(35)]) AS bitmap2
SELECT
bitmapOrCardinality(bitmap1, bitmap2) AS bitmapOrCardinality,
bitmapXorCardinality(bitmap1, bitmap2) AS bitmapXorCardinality,
bitmapAndnotCardinality(bitmap1, bitmap2) AS bitmapAndnotCardinality
┌─bitmapOrCardinality─┬─bitmapXorCardinality─┬─bitmapAndnotCardinality─┐
│ 8 │ 6 │ 3 │
└─────────────────────┴──────────────────────┴─────────────────────────┘
未完待續!