未排序数组中的密集排名(Clickhouse)

Dense Rank in Unsorted Arrays (Clickhouse)

有什么方法可以获得(未排序的)数组中元素的密集排名。

例如如果我有一个数组 [100,200,50] --> 我需要这些元素从最高到最低的相对等级,例如输出 -> [2,1,3]

尝试考虑如何使用 arrayEnumerateDense 但无济于事。

你说的对,可以使用函数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]
*/