Разница Clickhouse между элементами с разными индексами в массиве

avatar
Halina
1 июля 2021 в 19:35
354
1
1

У меня есть следующая задача. У нас есть ценовые диапазоны, которые установлены в группе Array, например [[1,1000],[1001, 2000], [2003,5000]]

Есть ли возможность получить разницу между вторым элементом массива x и первым элементом массива x+1. В результатах мне нужно что-то вроде [1,3]

Или я могу сделать плоский список и сделать arrayDifference между всеми элементами, но тогда я получаю [999,1,999,3,2997]

Как я могу получить нечетные элементы, используя только функции clickhouse?

Источник

Ответы (1)

avatar
vladimir
1 июля 2021 в 20:18
1

Попробуйте этот запрос:

SELECT
    arrs,
    arrayMap(index -> arrs[index][1] - arrs[index - 1][2], range(2, length(arrs) + 1)) AS result
FROM 
(
    /* test data set */
    SELECT [] AS arrs
    UNION ALL
    SELECT [[1, 1000]] AS arrs
    UNION ALL
    SELECT [[1, 1000], [1001, 2000]] AS arrs
    UNION ALL
    SELECT [[1, 1000], [1001, 2000], [2003, 5000]] AS arrs
    UNION ALL    
    SELECT [[1, 1000], [1001, 2000], [2003, 5000], [5008, 7890]] AS arrs
)

/*
┌─arrs───────────────────────────────────────────┬─result──┐
│ []                                             │ []      │
│ [[1,1000]]                                     │ []      │
│ [[1,1000],[1001,2000]]                         │ [1]     │
│ [[1,1000],[1001,2000],[2003,5000]]             │ [1,3]   │
│ [[1,1000],[1001,2000],[2003,5000],[5008,7890]] │ [1,3,8] │
└────────────────────────────────────────────────┴─────────┘
*/