未排序数组中的密集排名(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]
*/
有什么方法可以获得(未排序的)数组中元素的密集排名。
例如如果我有一个数组 [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]
*/