以A股日K數(shù)據(jù)為例镇眷,股票日交易數(shù)據(jù)表結(jié)構為:
CREATE TABLE stock_daily
(
symbol String, -- 股票代碼
name String, --股票名稱
date Date, --交易日期
open Float32, --開盤價
low Float32, --最低價
high Float32, --最高價
close Float32, --收盤價
volume Int64, --成交量
amount Float64 --成交額
)
ENGINE = MergeTree(date, (symbol, date), 8192)
需求為獲取每個股票最后五個交易日的交易數(shù)據(jù)仲锄。ClickHouse不提供窗口函數(shù)冰蘑,那么解決思路變?yōu)橄日业矫總€股票的最后五個交易日期稽屏,然后再通過股票代碼和交易日期關聯(lián)源表獲得相應詳細交易數(shù)據(jù)。
SELECT symbol,name,date,open,low,high,close,volume,amount
FROM
(
SELECT symbol,name,date,open,low,high,close,volume,amount
FROM stock_daily
)ALL INNER JOIN(
SELECT symbol,arrayJoin(dates)AS date
FROM
(
SELECT symbol,groupArray(5)(date)AS dates
FROM
(
SELECT symbol,date
FROM stock_daily
ORDER BY symbol,date DESC
)
GROUP BY symbol
)
WHERE dates[1]< toDate('2018-03-16') -- 過濾2018年3月16日停牌中的股票抛虫,ClickHouse中數(shù)組元素序號從1開始松靡。
)USING symbol,date
groupArray函數(shù)有兩種用法:groupArray(x)和groupArray(max_size)(x),數(shù)組中元素的順序就是分組數(shù)據(jù)中指定的順序建椰,groupArray(max_size)(x)可以指定數(shù)組的大小雕欺,即為需求中TopN的數(shù)值。
arrayJoin函數(shù)可以將array中的元素展開為行棉姐,當有多個array通過arrayJoin展開時結(jié)果為array的笛卡爾積屠列。
也可以通過arrayMap函數(shù)實現(xiàn)上述功能:
SELECT symbol,name,date,open,low,high,close,volume,amount
FROM
(
SELECT symbol,name,date,open,low,high,close,volume,amount
FROM stock_daily
)
ALL INNER JOIN
(
SELECT symbol,arrayJoin(dates)AS date
FROM
(
SELECT
symbol,
arrayMap(lambda(tuple(i),dates[(i + 1)]),range(5))AS dates
FROM
(
SELECT
symbol,groupArray(date)AS dates
FROM
(
SELECT symbol,date
FROM stock_daily
ORDER BY symbol,date DESC
)
GROUP BY symbol
)
)
WHERE dates[1]< toDate('2018-03-16') -- 過濾2018年3月16日停牌中的股票,ClickHouse中數(shù)組元素序號從1開始伞矩。
)USING symbol,date
結(jié)果如下:
ClickHouse引擎適合各類OLAP場景笛洛,效率極高,官方提供了很多內(nèi)置函數(shù)和特性乃坤,你值得擁有苛让。