получить все возможные комбинации из 3-х элементов массива ? Сделал через вложенный arrayMap - получилась очень громоздкая и медленная конструкция. Может быть есть более элегантное решение ? Помогите пожалуйста советом..
Вам нужно 5 8 10 или ещё 10 8 5 ?
В идеале - только 5 8 10. Но если будут дубли - уберу их дистинктом с предварительной сортировкой
WITH [2,5,8,10,3,6,19,0] as ar SELECT arrayZip(arrayEnumerate(ar),ar) as ar_z, arrayMap(x->arraySlice(ar_z,x.1,3) , ar_z).2 as ar_m, arrayFilter(x->length(x)=3,ar_m) as go
Это простое , но недостаточное решение ) Потому что в нем - только последовательные комбинации. Например - нет комбинации [2, 5, 10]. А нужны все возможные
with pre as (with [2,5,8,10,3,6,19,0] as arr select arrayJoin(arr) as i1, arrayJoin(arrayFilter(x-> x != i1, arr)) as i2, arrayJoin(arrayFilter(x-> x != i2 and x != i1, arr)) as i3) select distinct arraySort(array(i1, i2, i3)) as result from pre
кстати т.к. сказано, что числа не повторяются, можно заменить неравенство на строго больше/меньше тогда и distinct с сортировкой не нужен
Ну не так понял :)
не повторяются, но и не упорядочены. Можно отсортировать вначале и тогда соглашусь с вами.
Хм - спасибо - интересное решение. Попробую его на 1 млрд массивов - может проскочит.
Спасибо Тагир - получилось. Предварительно отсортировал массив и указал > в фильтрах массива. Задача кластеризации решена малой кровью )
Я могу тупить и под рукой нет ch, но мне кажется, предварительная сортировка не нужна
Она нужна для того чтобы убрать дистинкт и сортировку - после выполнения запроса. Вот эту : select distinct arraySort(array(i1, i2, i3))
Оставить только select array(i1, i2, i3)
Конечный вариант : with pre as ( with arraySort([2,5,8,10,3,6,19,0]) as arr select arrayJoin(arr) as i1 , arrayJoin(arrayFilter(x-> x > i1, arr)) as i2 , arrayJoin(arrayFilter(x-> x > i2, arr)) as i3 ) select array(i1, i2, i3) as result from pre
Роман - извините - промазал) Огромное спасибо
Обсуждают сегодня