未排序数组中的密集秩 (Clickhouse)
Posted
技术标签:
【中文标题】未排序数组中的密集秩 (Clickhouse)【英文标题】:Dense Rank in Unsorted Arrays (Clickhouse) 【发布时间】:2019-08-31 15:41:12 【问题描述】:有没有办法获得(未排序的)数组中元素的密集排名。
例如如果我有一个数组 [100,200,50] --> 我需要这些元素从最高到最低的相对排名,例如输出 -> [2,1,3]
尝试考虑如何使用arrayEnumerateDense,但无济于事。
【问题讨论】:
【参考方案1】:你是对的,可以使用函数arrayEnumerateDense。它应用于反向排序数组以获得所需的排名,然后将它们映射到原始数组。
SELECT
[100, 200, 50, 200, 50] AS arr,
arrayReverseSort(arr) AS sorted_arr,
arrayEnumerateDense(sorted_arr) AS sorted_arr_dense,
arrayMap(x -> (sorted_arr_dense[indexOf(sorted_arr, x)]), arr) AS arr_dense
FORMAT Vertical
/* Result
Row 1:
──────
arr: [100,200,50,200,50]
sorted_arr: [200,200,100,50,50]
sorted_arr_dense: [1,1,2,3,3]
arr_dense: [2,1,3,1,3]
*/
不使用arrayEnumerateDense也可以得到同样的结果:
SELECT
[100, 200, 50, 200, 50] AS arr,
arrayReverseSort(arrayDistinct(arr)) AS sorted_dist_arr,
arrayMap(x -> indexOf(sorted_dist_arr, x), arr) AS arr_dense
FORMAT Vertical
/* Result
Row 1:
──────
arr: [100,200,50,200,50]
sorted_dist_arr: [200,100,50]
arr_dense: [2,1,3,1,3]
*/
【讨论】:
顺便说一句,使用arrayMap(x -> indexOf(sorted_arr, x), arr) AS arr_dense2
获得排名,计算排名中的相同元素[3,1,4,1,4]
以上是关于未排序数组中的密集秩 (Clickhouse)的主要内容,如果未能解决你的问题,请参考以下文章