первым элементам, группируясь по вторым?
В итоге хочу получить массив вида (порядок не важен):
[2,3]
select [(2,'A'),(6,'B'),(9,'A'),(3,'B')] as arr, arraySort(x-> x.2, arr) arrS, arrayMap(x->x.1, arrS) a_1, arrayMap((x, index) -> if(index = 1, 0, arrS[index].2 <> arrS[index - 1].2), arrS, arrayEnumerate(arrS)) array_rules, arraySplit((x, y) -> y, a_1, array_rules) arr_groups, arrayMap(x-> arrayMin(x), arr_groups) result В arrS попадает Ваш массив, отсортированный по вторым элементам кортежей. В a_1 - массив из первых элементов кортежей. В array_rules создается правило разбиения (начинай новую группу, если у текущего элемента второй член кортежа не равен второму элементу предыдущего кортежа). В arr_groups попадает массив из первых элементов кортежей, разбитый по правилу array_rules - получится [[2,9], [6,3]]. Наконец, в result попадут минимумы каждого массива
Можно и без лямбд: select groupArray(a) from ( select min(arr.1) a, arr.2 b from (select [(2,'A'),(6,'B'),(9,'A'),(3,'B')] as arr) n ARRAY JOIN arr group by b)
Или select groupArray(a) from ( select [(2,'A'),(6,'B'),(9,'A'),(3,'B')] as arr, min(arrayJoin(arr).1) a group by arrayJoin(arr).2 )
Обсуждают сегодня