未排序数组中的密集秩 (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)的主要内容,如果未能解决你的问题,请参考以下文章

使用 linq 实现密集秩

Clickhouse - 将数组映射到要排序的列

clickhouse:如何在另一列中找到高于日期的数组中的最小日期?

键/值数组的双调排序

排序数组中的“==”不比未排序数组快吗? [重复]

比较 ClickHouse 行中的两个数组