Clickhouse 開窗函數


向大神學習:https://mp.weixin.qq.com/s/ubahKb5NajqHv0LGvAP-iw

SELECT arrayEnumerate([10,20,30,10,40]) AS row_number, /*按照數據順序輸出應的ID*/
arrayEnumerateDense([10,20,30,10,40]) AS dense_rank, /*按照數據出現輸出ID,其中數字相同的,ID 也會相同*/
arrayEnumerateUniq([10,20,30,10,40]) AS uniq_ran ; /*輸出數據出現次數*/



CREATE TABLE test_data engine = Memory AS
WITH(
SELECT ['A','A','A','A','B','B','B','B','B','A','59','90','80','80','65','75','78','88','99','70']
)AS dict;
select * from test_data ;

/*第一步:按val 排序,因為條件是 order by val,按照分時升序排列*/
SELECT * FROM test_data ORDER BY val;


/*第二步:按id 分組,因為條件是PARTITION BY id*/
select id
from
(
select * from test_data order by val as asc
)
group by id ;

/*第三步,計算val的RANK ,需要用到剛介紹的幾個
arrayEnumerate*函數,由於它們的入參要求數組,
所以先使用groupArray將val轉成數組:*/
select
id,
groupArray(val) as arr_val,
arrayEnumerate(arr_val) as row_number,
arrayEnumerateDense(arr_val) as dense_rank,
arrayEnumerateUniq(arr_val) as uniq_rank
from
(
select *
from test_data
order by val asc
) group by id;

/*第四步:數組展開,利用ARRAY JOIN 將數組展開,並按照id,RANK 列排序*/
select
id,
val,
row_number,
dense_rank,
uniq_rank
from
(
select
id,
groupArray(val) as arr_val,
arrayEnumerate(arr_val) as row_number,
arrayEnumerateDense(arr_val) as dense_rank,
arrayEnumerateUniq(arr_val) as uniq_rank
from
(
select * from test_data
order by val asc
)
group by id
)
ARRAY JOIN
arr_val as val,
row_number,
dense_rank,
uniq_rank
order by
id asc,
row_number asc,
dense_rank asc


免責聲明!

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



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