二十七、clickhouse聚合函數


--1.常用函數

count
返回記錄條數。

如

SELECT count() FROM table
注:如果求 COUNT(DISTINCT x),則使用 uniq 函數

any(x)
返回遇到的第一個值

備注:待補充

anyHeavy(x)
通過 heavy hitters 算法,得到一個經常出現的值.

示例

SELECT anyHeavy(AirlineID) AS res
FROM ontime
anyLast(x)
返回最后遇到的值

min(x)
返回最小值

max(x)
返回最大值

argMin(arg,val)
TBD

argMax(arg,val)
TBD

sum(x)
求和

僅對數值有效

sumWithOverflow(x)
求和

如果超過上限,則報錯

sumMap(key,value)
對於相同的 key,對其 value 求和

示例

輸入

CREATE TABLE sum_map(
date Date,
timeslot DateTime,
statusMap Nested(
status UInt16,
requests UInt64
)
) ENGINE = Log;
INSERT INTO sum_map VALUES
('2000-01-01', '2000-01-01 00:00:00', [1, 2, 3], [10, 10, 10]),
('2000-01-01', '2000-01-01 00:00:00', [3, 4, 5], [10, 10, 10]),
('2000-01-01', '2000-01-01 00:01:00', [4, 5, 6], [10, 10, 10]),
('2000-01-01', '2000-01-01 00:01:00', [6, 7, 8], [10, 10, 10]);
SELECT
timeslot,
sumMap(statusMap.status, statusMap.requests)
FROM sum_map
GROUP BY timeslot
查詢

┌────────────timeslot─┬─sumMap(statusMap.status, statusMap.requests)─┐
│ 2000-01-01 00:00:00 │ ([1,2,3,4,5],[10,10,20,10,10]) │
│ 2000-01-01 00:01:00 │ ([4,5,6,7,8],[10,10,20,10,10]) │
└─────────────────────┴──────────────────────────────────────────────┘
avg(x)
平均值

uniq(x)
求近似的排重值, 適用於數值,字符串,日期,日期時間,以及 multiple 和 tuple 參數

使用了自適合抽樣算法:在 65535 下非常准確和高效。

uniqCombined(x)
求近似的排重值,適用於數值,字符串,日期,日期時間,以及 multiple 和 tuple 參數

使用了組合的三個算法:數組,hash 表和 HyperLogLog 表。

內存消耗比 uniq 要小幾倍,同時精度高幾倍,但是性能一般比 uniq 慢,雖然有時也會快。最大支持到 96KiB 個狀態.

uniqHLL12(x)
使用 HyperLogLog 算法來做排重值的近似計算,支持 2.5KB 個狀態.

uniqExact(x)
計算精確的排重值.

groupArray(x), groupArray(max_size)(x)
創建一個數組值

運行示例

:) select str_nest.y from schema_nested;

SELECT str_nest.y
FROM schema_nested

┌─str_nest.y───────────────┐
│ ['search','mock1@a.com'] │
│ ['image','mock1@a.com'] │
│ ['video','mock2@a.com'] │
│ ['image','mock2@a.com'] │
└──────────────────────────┘
┌─str_nest.y──────────────────────────────┐
│ ['search','mock1@a.com','news'] │
│ ['image','mock1@a.com','search','news'] │
└─────────────────────────────────────────┘
┌─str_nest.y─────────────────────────────┐
│ ['video','mock2@a.com'] │
│ ['image','mock2@a.com','music','news'] │
└────────────────────────────────────────┘

8 rows in set. Elapsed: 0.003 sec.
:) select groupArray(str_nest.y) from schema_nested

SELECT groupArray(str_nest.y)
FROM schema_nested

┌─groupArray(str_nest.y)────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ [['search','mock1@a.com'],['image','mock1@a.com'],['video','mock2@a.com'],['image','mock2@a.com'],['search','mock1@a.com','news'],['image','mock1@a.com','search','news'],['video','mock2@a.com'],['image','mock2@a.com','music','news']] │
└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

1 rows in set. Elapsed: 0.003 sec.
:) select groupArray(3)(str_nest.y) from schema_nested

SELECT groupArray(3)(str_nest.y)
FROM schema_nested

┌─groupArray(3)(str_nest.y)──────────────────────────────────────────────────┐
│ [['search','mock1@a.com'],['image','mock1@a.com'],['video','mock2@a.com']] │
└────────────────────────────────────────────────────────────────────────────┘

1 rows in set. Elapsed: 0.002 sec.
groupArrayInsertAt
TBD

groupUniqArray(x)
生成排重的數組,內存消耗與 uniqExact 方法相同

:) select groupUniqArray(str_nest.y) from schema_nested

SELECT groupUniqArray(str_nest.y)
FROM schema_nested

┌─groupUniqArray(str_nest.y)────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ [['image','mock2@a.com','music','news'],['image','mock1@a.com'],['image','mock2@a.com'],['video','mock2@a.com'],['image','mock1@a.com','search','news'],['search','mock1@a.com'],['search','mock1@a.com','news']] │
└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

1 rows in set. Elapsed: 0.004 sec.
quantile(level)(x)
估算百分位點值.

level 是一個 01 之間的常數,但是不要為 0 或者 1. 0 或者 1 時,使用 min,max 方法最合適.

quantileDeterministic(level)(x, determinator)
TBD

quantileTiming(level)(x)
TBD

quantileTimingWeighted(level)(x, weight)
TBD

quantileExact(level)(x)
TBD

quantileExactWeighted(level)(x, weight)
TBD

quantileTDigest(level)(x)
TBD

median
求中位數

每一個百分位點方法,都對應着一個求中位數的方法,如

median, medianDeterministic, medianTiming, medianTimingWeighted, medianExact, medianExactWeighted, medianTDigest

quantiles(level1, level2, ...)(x)
求多個百分位點

也對應着一系列的方法 quantiles, quantilesDeterministic, quantilesTiming, quantilesTimingWeighted, quantilesExact, quantilesExactWeighted, quantilesTDigest

varSamp(x)
求方差,結果是隨機變量的方差的無偏估計

varPop(x)
求總體方差

stddevSamp(x)
為 varSamp(x) 的平均根

stddevPop(x)
為 varPop(x) 的平均根

topK
使用了 Filtered Space-Saving 算法來計算 topK

同時使用了 Parallel Space Saving 算法來進行 reduce and combine.

topK(N)(column)

:) select topK(3)(str_nest.y) from schema_nested

SELECT topK(3)(str_nest.y)
FROM schema_nested

┌─topK(3)(str_nest.y)────────────────────────────────────────────────────────┐
│ [['video','mock2@a.com'],['search','mock1@a.com'],['image','mock1@a.com']] │
└────────────────────────────────────────────────────────────────────────────┘

1 rows in set. Elapsed: 0.004 sec.
covarSamp(x,y)
計算協方差

covarPop(x,y)
計算總體協方差

corr(x,y)
計算 Pearson 相關系數

 

 

--2.含參聚合函數

sequenceMatch(pattern)(time, cond1, cond2, ...)
按順利先后匹配事件

pattern: 類似正則表達式的匹配規則
time: 事件發生時間
cond1, cond2: 最多 32 個,來標識條件是否滿足
返回值

0:不匹配
1: 匹配
示例

sequenceMatch ('(?1).*(?2)')(EventTime, URL LIKE '%company%', URL LIKE '%cart%')
--是否存在事件鏈,即先訪問了 company 的事件,再訪問了 cart 的事件

--也可以通過別的聚合方法來表示

minIf(EventTime, URL LIKE '%company%') < maxIf(EventTime, URL LIKE '%cart%')
sequenceCount(pattern)(time, cond1, cond2, ...)
--邏輯與 sequenceMatch 函數一樣,但是返回值為 chain 的編號.

 

TBD

uniqUpTo(N)(x)
返回 N 個排重值數目,如果實際值大於 N,則返回 N+1

--3.聚合函數后綴
-If
任何聚合函數都可以通過增加后綴 If, 來增加一個外部參數條件. 聚合函數僅處理滿足條件的記錄行. 如果條件一次也沒有觸發,則返回默認值(通常是 0 或者是空字符串)

這樣可以一次處理多個聚合條件,而不需要轉換為子查詢或者 JOIN 來計算.

示例

sumIf(column, cond), countIf(cond), avgIf(x, cond), quantilesTimingIf(level1, level2)(x, cond), argMinIf(arg, val, cond)

 

-Array
任何聚合函數都可以通過增加后綴 Array, 來使原來的參數類型 T 變為新的參數類型 Array(T)。

在處理時,原來的聚合函數會依次處理 Array 中的每一項.

示例

sumArray(arr) : 對 Arrays 中的所有元素進行求和,即 sum(arraySum(arr))

uniqArray(arr): 對 Arrays 中的所有元素進行排重值,即 uniq(arrayJoin(arr))

-If 和 -Array 可以組合使用,但是 Array 必須在前,If 在后。例如

uniqArrayIf(arr, cond)

quantilesTimingArrayIf(level1, level2)(arr, cond)

-State
返回的不是結果值,返回的是中間狀態. 這個是與 AggregatingMergeTree 來配合使用的.

-Merge
聚合函數會把中間狀態會為參數,進行 Merge,來完成聚合,返回最終的結果值.

-MergeState
與 -Merge 類似,但是返回的不是結果值,而是類似於 -State 的中間狀態.

-ForEach
將對 table 使用的聚合函數,轉換為對數組的聚合函數。對數組的每一項進行處理,返回一個結果數組。

如:

sumForEach([1,2],[3,4,5],[6,7])

結果為

[10,13,5]

 


免責聲明!

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



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