mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-12-01 20:12:02 +00:00
381 lines
15 KiB
Markdown
381 lines
15 KiB
Markdown
# Функции по работе с массивами
|
||
|
||
|
||
## empty
|
||
Возвращает 1 для пустого массива, и 0 для непустого массива.
|
||
Тип результата - UInt8.
|
||
Функция также работает для строк.
|
||
|
||
## notEmpty
|
||
Возвращает 0 для пустого массива, и 1 для непустого массива.
|
||
Тип результата - UInt8.
|
||
Функция также работает для строк.
|
||
|
||
## length
|
||
Возвращает количество элементов в массиве.
|
||
Тип результата - UInt64.
|
||
Функция также работает для строк.
|
||
|
||
## emptyArrayUInt8, emptyArrayUInt16, emptyArrayUInt32, emptyArrayUInt64
|
||
|
||
## emptyArrayInt8, emptyArrayInt16, emptyArrayInt32, emptyArrayInt64
|
||
|
||
## emptyArrayFloat32, emptyArrayFloat64
|
||
|
||
## emptyArrayDate, emptyArrayDateTime
|
||
|
||
## emptyArrayString
|
||
Принимает ноль аргументов и возвращает пустой массив соответствующего типа.
|
||
|
||
## emptyArrayToSingle
|
||
Принимает пустой массив и возвращает массив из одного элемента, равного значению по умолчанию.
|
||
|
||
## range(N)
|
||
Возвращает массив чисел от 0 до N-1.
|
||
На всякий случай, если на блок данных, создаются массивы суммарной длины больше 100 000 000 элементов, то кидается исключение.
|
||
|
||
## array(x1, ...), оператор \[x1, ...\]
|
||
Создаёт массив из аргументов функции.
|
||
Аргументы должны быть константами и иметь типы, для которых есть наименьший общий тип. Должен быть передан хотя бы один аргумент, так как иначе непонятно, какого типа создавать массив. То есть, с помощью этой функции невозможно создать пустой массив (для этого используйте функции emptyArray\*, описанные выше).
|
||
Возвращает результат типа Array(T), где T - наименьший общий тип от переданных аргументов.
|
||
|
||
## arrayConcat
|
||
|
||
Объединяет массивы, переданные в качестве аргументов.
|
||
|
||
```
|
||
arrayConcat(arrays)
|
||
```
|
||
|
||
**Аргументы**
|
||
|
||
- `arrays` - Перечисленные через запятую массивы `[values]`.
|
||
|
||
**Пример**
|
||
|
||
```sql
|
||
SELECT arrayConcat([1, 2], [3, 4], [5, 6]) AS res
|
||
```
|
||
```
|
||
┌─res───────────┐
|
||
│ [1,2,3,4,5,6] │
|
||
└───────────────┘
|
||
```
|
||
|
||
|
||
## arrayElement(arr, n), оператор arr\[n\]
|
||
Достаёт элемент с индексом n из массива arr.
|
||
n должен быть любым целочисленным типом.
|
||
Индексы в массиве начинаются с единицы.
|
||
Поддерживаются отрицательные индексы - в этом случае, будет выбран соответствующий по номеру элемент с конца. Например, arr\[-1\] - последний элемент массива.
|
||
|
||
Если индекс выходит за границы массива, то возвращается некоторое значение по умолчанию (0 для чисел, пустая строка для строк и т. п.).
|
||
|
||
## has(arr, elem)
|
||
Проверяет наличие элемента elem в массиве arr.
|
||
Возвращает 0, если элемента в массиве нет, или 1, если есть.
|
||
|
||
`NULL` обрабатывается как значение.
|
||
|
||
```
|
||
SELECT has([1, 2, NULL], NULL)
|
||
|
||
┌─has([1, 2, NULL], NULL)─┐
|
||
│ 1 │
|
||
└─────────────────────────┘
|
||
```
|
||
|
||
## indexOf(arr, x)
|
||
Возвращает индекс первого элемента x (начиная с 1), если он есть в массиве, или 0, если его нет.
|
||
|
||
Пример:
|
||
|
||
```
|
||
:) select indexOf([1,3,NULL,NULL],NULL)
|
||
|
||
SELECT indexOf([1, 3, NULL, NULL], NULL)
|
||
|
||
┌─indexOf([1, 3, NULL, NULL], NULL)─┐
|
||
│ 3 │
|
||
└───────────────────────────────────┘
|
||
```
|
||
|
||
Элементы, равные `NULL`, обрабатываются как обычные значения.
|
||
|
||
## countEqual(arr, x)
|
||
Возвращает количество элементов массива, равных x. Эквивалентно arrayCount(elem -> elem = x, arr).
|
||
|
||
Элементы `NULL` обрабатываются как отдельные значения.
|
||
|
||
Пример:
|
||
|
||
```
|
||
SELECT countEqual([1, 2, NULL, NULL], NULL)
|
||
|
||
┌─countEqual([1, 2, NULL, NULL], NULL)─┐
|
||
│ 2 │
|
||
└──────────────────────────────────────┘
|
||
```
|
||
|
||
|
||
## arrayEnumerate(arr)
|
||
Возвращает массив \[1, 2, 3, ..., length(arr)\]
|
||
|
||
Эта функция обычно используется совместно с ARRAY JOIN. Она позволяет, после применения ARRAY JOIN, посчитать что-либо только один раз для каждого массива. Пример:
|
||
|
||
```sql
|
||
SELECT
|
||
count() AS Reaches,
|
||
countIf(num = 1) AS Hits
|
||
FROM test.hits
|
||
ARRAY JOIN
|
||
GoalsReached,
|
||
arrayEnumerate(GoalsReached) AS num
|
||
WHERE CounterID = 160656
|
||
LIMIT 10
|
||
```
|
||
|
||
```text
|
||
┌─Reaches─┬──Hits─┐
|
||
│ 95606 │ 31406 │
|
||
└─────────┴───────┘
|
||
```
|
||
|
||
В этом примере, Reaches - число достижений целей (строк, получившихся после применения ARRAY JOIN), а Hits - число хитов (строк, которые были до ARRAY JOIN). В данном случае, тот же результат можно получить проще:
|
||
|
||
```sql
|
||
SELECT
|
||
sum(length(GoalsReached)) AS Reaches,
|
||
count() AS Hits
|
||
FROM test.hits
|
||
WHERE (CounterID = 160656) AND notEmpty(GoalsReached)
|
||
```
|
||
|
||
```text
|
||
┌─Reaches─┬──Hits─┐
|
||
│ 95606 │ 31406 │
|
||
└─────────┴───────┘
|
||
```
|
||
|
||
Также эта функция может быть использована в функциях высшего порядка. Например, с её помощью можно достать индексы массива для элементов, удовлетворяющих некоторому условию.
|
||
|
||
## arrayEnumerateUniq(arr, ...)
|
||
Возвращает массив, такого же размера, как исходный, где для каждого элемента указано, какой он по счету среди элементов с таким же значением.
|
||
Например: arrayEnumerateUniq(\[10, 20, 10, 30\]) = \[1, 1, 2, 1\].
|
||
|
||
Эта функция полезна при использовании ARRAY JOIN и агрегации по элементам массива.
|
||
Пример:
|
||
|
||
```sql
|
||
SELECT
|
||
Goals.ID AS GoalID,
|
||
sum(Sign) AS Reaches,
|
||
sumIf(Sign, num = 1) AS Visits
|
||
FROM test.visits
|
||
ARRAY JOIN
|
||
Goals,
|
||
arrayEnumerateUniq(Goals.ID) AS num
|
||
WHERE CounterID = 160656
|
||
GROUP BY GoalID
|
||
ORDER BY Reaches DESC
|
||
LIMIT 10
|
||
```
|
||
|
||
```text
|
||
┌──GoalID─┬─Reaches─┬─Visits─┐
|
||
│ 53225 │ 3214 │ 1097 │
|
||
│ 2825062 │ 3188 │ 1097 │
|
||
│ 56600 │ 2803 │ 488 │
|
||
│ 1989037 │ 2401 │ 365 │
|
||
│ 2830064 │ 2396 │ 910 │
|
||
│ 1113562 │ 2372 │ 373 │
|
||
│ 3270895 │ 2262 │ 812 │
|
||
│ 1084657 │ 2262 │ 345 │
|
||
│ 56599 │ 2260 │ 799 │
|
||
│ 3271094 │ 2256 │ 812 │
|
||
└─────────┴─────────┴────────┘
|
||
```
|
||
|
||
В этом примере, для каждого идентификатора цели, посчитано количество достижений целей (каждый элемент вложенной структуры данных Goals является достижением целей) и количество визитов. Если бы не было ARRAY JOIN, мы бы считали количество визитов как sum(Sign). Но в данном случае, строчки были размножены по вложенной структуре Goals, и чтобы после этого учесть каждый визит один раз, мы поставили условие на значение функции arrayEnumerateUniq(Goals.ID).
|
||
|
||
Функция arrayEnumerateUniq может принимать несколько аргументов - массивов одинаковых размеров. В этом случае, уникальность считается для кортежей элементов на одинаковых позициях всех массивов.
|
||
|
||
```sql
|
||
SELECT arrayEnumerateUniq([1, 1, 1, 2, 2, 2], [1, 1, 2, 1, 1, 2]) AS res
|
||
```
|
||
|
||
```text
|
||
┌─res───────────┐
|
||
│ [1,2,1,1,2,1] │
|
||
└───────────────┘
|
||
```
|
||
|
||
Это нужно при использовании ARRAY JOIN с вложенной структурой данных и затем агрегации по нескольким элементам этой структуры.
|
||
|
||
## arrayPopBack
|
||
|
||
Удаляет последний элемент из массива.
|
||
|
||
```
|
||
arrayPopBack(array)
|
||
```
|
||
|
||
**Аргументы**
|
||
|
||
- `array` - Массив.
|
||
|
||
**Пример**
|
||
|
||
```sql
|
||
SELECT arrayPopBack([1, 2, 3]) AS res
|
||
```
|
||
```
|
||
┌─res───┐
|
||
│ [1,2] │
|
||
└───────┘
|
||
```
|
||
|
||
## arrayPopFront
|
||
|
||
Удаляет первый элемент из массива.
|
||
|
||
```
|
||
arrayPopFront(array)
|
||
```
|
||
|
||
**Аргументы**
|
||
|
||
- `array` - Массив.
|
||
|
||
**Пример**
|
||
|
||
```sql
|
||
SELECT arrayPopFront([1, 2, 3]) AS res
|
||
```
|
||
```
|
||
┌─res───┐
|
||
│ [2,3] │
|
||
└───────┘
|
||
```
|
||
|
||
## arrayPushBack
|
||
|
||
Добавляет один элемент в конец массива.
|
||
|
||
```
|
||
arrayPushBack(array, single_value)
|
||
```
|
||
|
||
**Аргументы**
|
||
|
||
- `array` - Массив.
|
||
- `single_value` - Одиночное значение. В массив с числам можно добавить только числа, в массив со строками только строки. При добавлении чисел ClickHouse автоматически приводит тип `single_value` к типу данных массива. Подробнее о типах данных в ClickHouse читайте в разделе "[Типы данных](../../data_types/index.md#data_types)". Может быть равно `NULL`. Функция добавит элемент `NULL` в массив, а тип элементов массива преобразует в `Nullable`.
|
||
|
||
**Пример**
|
||
|
||
```sql
|
||
SELECT arrayPushBack(['a'], 'b') AS res
|
||
```
|
||
```
|
||
┌─res───────┐
|
||
│ ['a','b'] │
|
||
└───────────┘
|
||
```
|
||
|
||
## arrayPushFront
|
||
|
||
Добавляет один элемент в начало массива.
|
||
|
||
```
|
||
arrayPushFront(array, single_value)
|
||
```
|
||
|
||
**Аргументы**
|
||
|
||
- `array` - Массив.
|
||
- `single_value` - Одиночное значение. В массив с числам можно добавить только числа, в массив со строками только строки. При добавлении чисел ClickHouse автоматически приводит тип `single_value` к типу данных массива. Подробнее о типах данных в ClickHouse читайте в разделе "[Типы данных](../../data_types/index.md#data_types)". Может быть равно `NULL`. Функция добавит элемент `NULL` в массив, а тип элементов массива преобразует в `Nullable`.
|
||
|
||
**Пример**
|
||
|
||
```sql
|
||
SELECT arrayPushBack(['b'], 'a') AS res
|
||
```
|
||
```
|
||
┌─res───────┐
|
||
│ ['a','b'] │
|
||
└───────────┘
|
||
```
|
||
|
||
## arrayResize
|
||
|
||
Изменяет длину массива.
|
||
|
||
```
|
||
arrayResize(array, size[, extender])
|
||
```
|
||
|
||
**Параметры:**
|
||
|
||
- `array` — массив.
|
||
- `size` — необходимая длина массива.
|
||
- Если `size` меньше изначального размера массива, то массив обрезается справа.
|
||
- Если `size` больше изначального размера массива, массив дополняется справа значениями `extender` или значениями по умолчанию для типа данных элементов массива.
|
||
- `extender` — значение для дополнения массива. Может быть `NULL`.
|
||
|
||
**Возвращаемое значение:**
|
||
|
||
Массив длины `size`.
|
||
|
||
**Примеры вызовов**
|
||
|
||
```
|
||
SELECT arrayResize([1], 3)
|
||
|
||
┌─arrayResize([1], 3)─┐
|
||
│ [1,0,0] │
|
||
└─────────────────────┘
|
||
```
|
||
```
|
||
SELECT arrayResize([1], 3, NULL)
|
||
|
||
┌─arrayResize([1], 3, NULL)─┐
|
||
│ [1,NULL,NULL] │
|
||
└───────────────────────────┘
|
||
```
|
||
|
||
## arraySlice
|
||
|
||
Возвращает срез массива.
|
||
|
||
```
|
||
arraySlice(array, offset[, length])
|
||
```
|
||
|
||
**Аргументы**
|
||
|
||
- `array` - Массив данных.
|
||
- `offset` - Отступ от края массива. Положительное значение - отступ слева, отрицательное значение - отступ справа. Отсчет элементов массива начинается с 1.
|
||
- `length` - Длина необходимого среза. Если указать отрицательное значение, то функция вернёт открытый срез `[offset, array_length - length)`. Если не указать значение, то функция вернёт срез `[offset, the_end_of_array]`.
|
||
|
||
**Пример**
|
||
|
||
```sql
|
||
SELECT arraySlice([1, 2, NULL, 4, 5], 2, 3) AS res
|
||
```
|
||
```
|
||
┌─res────────┐
|
||
│ [2,NULL,4] │
|
||
└────────────┘
|
||
```
|
||
|
||
Элементы массива равные `NULL` обрабатываются как обычные значения.
|
||
|
||
## arrayUniq(arr, ...)
|
||
Если передан один аргумент, считает количество разных элементов в массиве.
|
||
Если передано несколько аргументов, считает количество разных кортежей из элементов на соответствующих позициях в нескольких массивах.
|
||
|
||
Если необходимо получить список уникальных элементов массива, можно воспользоваться arrayReduce('groupUniqArray', arr).
|
||
|
||
## arrayJoin(arr)
|
||
Особенная функция. Смотрите раздел ["Функция arrayJoin"](array_join.md#functions_arrayjoin).
|