clickhouse 三(clickhouse函數使用總結)


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 │
└─────────────────────┴──────────────────────┴─────────────────────────┘

未完待續!


免責聲明!

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



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