2020-03-20 18:20:59 +00:00
# Функции по работе с массивами {#funktsii-po-rabote-s-massivami}
2017-03-12 17:58:51 +00:00
2019-09-23 23:50:26 +00:00
## empty {#function-empty}
2018-11-10 20:00:22 +00:00
2017-03-12 17:58:51 +00:00
Возвращает 1 для пустого массива, и 0 для непустого массива.
Тип результата - UInt8.
Функция также работает для строк.
2019-09-23 23:50:26 +00:00
## notEmpty {#function-notempty}
2018-11-10 20:00:22 +00:00
2017-03-12 17:58:51 +00:00
Возвращает 0 для пустого массива, и 1 для непустого массива.
Тип результата - UInt8.
Функция также работает для строк.
2020-03-22 09:14:59 +00:00
## length {#array_functions-length}
2018-11-10 20:00:22 +00:00
2017-03-12 17:58:51 +00:00
Возвращает количество элементов в массиве.
Тип результата - UInt64.
Функция также работает для строк.
2020-03-20 18:20:59 +00:00
## emptyArrayUInt8, emptyArrayUInt16, emptyArrayUInt32, emptyArrayUInt64 {#emptyarrayuint8-emptyarrayuint16-emptyarrayuint32-emptyarrayuint64}
2017-03-12 17:58:51 +00:00
2020-03-20 18:20:59 +00:00
## emptyArrayInt8, emptyArrayInt16, emptyArrayInt32, emptyArrayInt64 {#emptyarrayint8-emptyarrayint16-emptyarrayint32-emptyarrayint64}
2017-03-12 17:58:51 +00:00
2020-03-20 18:20:59 +00:00
## emptyArrayFloat32, emptyArrayFloat64 {#emptyarrayfloat32-emptyarrayfloat64}
2017-03-12 17:58:51 +00:00
2020-03-20 18:20:59 +00:00
## emptyArrayDate, emptyArrayDateTime {#emptyarraydate-emptyarraydatetime}
2017-03-12 17:58:51 +00:00
2020-03-20 18:20:59 +00:00
## emptyArrayString {#emptyarraystring}
2018-11-10 20:00:22 +00:00
2017-03-12 17:58:51 +00:00
Принимает ноль аргументов и возвращает пустой массив соответствующего типа.
2020-03-20 18:20:59 +00:00
## emptyArrayToSingle {#emptyarraytosingle}
2018-11-10 20:00:22 +00:00
2017-03-12 17:58:51 +00:00
Принимает пустой массив и возвращает массив из одного элемента, равного значению по умолчанию.
2020-03-20 18:20:59 +00:00
## range(N) {#rangen}
2018-11-10 20:00:22 +00:00
2017-03-12 17:58:51 +00:00
Возвращает массив чисел от 0 до N-1.
Н а всякий случай, если на блок данных, создаются массивы суммарной длины больше 100 000 000 элементов, то кидается исключение.
2020-03-20 18:20:59 +00:00
## array(x1, …), оператор \[x1, …\] {#arrayx1-operator-x1}
2018-11-10 20:00:22 +00:00
2017-03-12 17:58:51 +00:00
Создаёт массив из аргументов функции.
2017-10-25 05:27:09 +00:00
Аргументы должны быть константами и иметь типы, для которых есть наименьший общий тип. Должен быть передан хотя бы один аргумент, так как иначе непонятно, какого типа создавать массив. Т о есть, с помощью этой функции невозможно создать пустой массив (для этого используйте функции emptyArray\*, описанные выше).
2017-03-12 17:58:51 +00:00
Возвращает результат типа Array(T), где T - наименьший общий тип от переданных аргументов.
2020-03-20 18:20:59 +00:00
## arrayConcat {#arrayconcat}
2017-11-22 06:14:09 +00:00
Объединяет массивы, переданные в качестве аргументов.
2020-03-20 18:20:59 +00:00
``` sql
2017-11-22 06:14:09 +00:00
arrayConcat(arrays)
```
2018-11-10 20:00:22 +00:00
**Параметры**
2017-11-22 06:14:09 +00:00
2020-03-21 04:11:51 +00:00
- `arrays` – произвольное количество элементов типа [Array ](../../data_types/array.md )
**Пример**
2020-03-20 18:20:59 +00:00
<!-- -->
2017-11-22 06:14:09 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2017-11-22 06:14:09 +00:00
SELECT arrayConcat([1, 2], [3, 4], [5, 6]) AS res
```
2018-11-10 20:00:22 +00:00
2020-03-20 18:20:59 +00:00
``` text
2017-11-22 06:14:09 +00:00
┌─res───────────┐
│ [1,2,3,4,5,6] │
└───────────────┘
```
2020-03-20 18:20:59 +00:00
## arrayElement(arr, n), operator arr\[n\] {#arrayelementarr-n-operator-arrn}
2017-11-22 06:14:09 +00:00
2018-11-10 20:00:22 +00:00
Достаёт элемент с индексом n из массива arr. n должен быть любым целочисленным типом.
2017-03-12 17:58:51 +00:00
Индексы в массиве начинаются с единицы.
2018-11-10 20:00:22 +00:00
Поддерживаются отрицательные индексы. В этом случае, будет выбран соответствующий по номеру элемент с конца. Например, arr\[-1\] - последний элемент массива.
2017-03-12 17:58:51 +00:00
2019-09-05 22:33:36 +00:00
Если индекс выходит за границы массива, то возвращается некоторое значение по умолчанию (0 для чисел, пустая строка для строк и т. п.), кроме случая с неконстантным массивом и константным индексом 0 (в этом случае будет ошибка `Array indices are 1-based` ).
2017-03-12 17:58:51 +00:00
2020-03-20 18:20:59 +00:00
## has(arr, elem) {#hasarr-elem}
2018-11-10 20:00:22 +00:00
2017-03-12 17:58:51 +00:00
Проверяет наличие элемента elem в массиве arr.
Возвращает 0, если элемента в массиве нет, или 1, если есть.
2018-07-26 14:41:59 +00:00
`NULL` обрабатывается как значение.
2020-03-20 18:20:59 +00:00
``` sql
2018-07-26 14:41:59 +00:00
SELECT has([1, 2, NULL], NULL)
2019-09-23 15:31:46 +00:00
```
2020-03-20 18:20:59 +00:00
``` text
2018-07-26 14:41:59 +00:00
┌─has([1, 2, NULL], NULL)─┐
│ 1 │
└─────────────────────────┘
```
2020-03-20 18:20:59 +00:00
## hasAll {#hasall}
2018-11-10 20:00:22 +00:00
Проверяет, является ли один массив подмножеством другого.
2020-03-20 18:20:59 +00:00
``` sql
2018-11-10 20:00:22 +00:00
hasAll(set, subset)
```
**Параметры**
2020-03-21 04:11:51 +00:00
- `set` – массив любого типа с набором элементов.
- `subset` – массив любого типа с о значениями, которые проверяются на вхождение в `set` .
2018-11-10 20:00:22 +00:00
**Возвращаемые значения**
2020-03-21 04:11:51 +00:00
- `1` , если `set` содержит все элементы из `subset` .
- `0` , в противном случае.
2018-11-10 20:00:22 +00:00
**Особенности**
2020-03-21 04:11:51 +00:00
- Пустой массив является подмножеством любого массива.
- `NULL` обрабатывается как значение.
- Порядок значений в обоих массивах не имеет значения.
2018-11-10 20:00:22 +00:00
**Примеры**
`SELECT hasAll([], [])` возвращает 1.
`SELECT hasAll([1, Null], [Null])` возвращает 1.
`SELECT hasAll([1.0, 2, 3, 4], [1, 3])` возвращает 1.
`SELECT hasAll(['a', 'b'], ['a'])` возвращает 1.
`SELECT hasAll([1], ['a'])` возвращает 0.
`SELECT hasAll([[1, 2], [3, 4]], [[1, 2], [3, 5]])` возвращает 0.
2020-03-20 18:20:59 +00:00
## hasAny {#hasany}
2018-11-10 20:00:22 +00:00
Проверяет, имеют ли два массива хотя бы один общий элемент.
2020-03-20 18:20:59 +00:00
``` sql
2018-11-10 20:00:22 +00:00
hasAny(array1, array2)
```
**Параметры**
2020-03-21 04:11:51 +00:00
- `array1` – массив любого типа с набором элементов.
- `array2` – массив любого типа с набором элементов.
2018-11-10 20:00:22 +00:00
**Возвращаемые значения**
2020-03-21 04:11:51 +00:00
- `1` , если `array1` и `array2` имеют хотя бы один одинаковый элемент.
- `0` , в противном случае.
2018-11-10 20:00:22 +00:00
**Особенности**
2020-03-21 04:11:51 +00:00
- `NULL` обрабатывается как значение.
- Порядок значений в обоих массивах не имеет значения.
2018-11-10 20:00:22 +00:00
**Примеры**
`SELECT hasAny([1], [])` возвращает `0` .
`SELECT hasAny([Null], [Null, 1])` возвращает `1` .
`SELECT hasAny([-128, 1., 512], [1])` возвращает `1` .
`SELECT hasAny([[1, 2], [3, 4]], ['a', 'c'])` возвращает `0` .
`SELECT hasAll([[1, 2], [3, 4]], [[1, 2], [1, 2]])` возвращает `1` .
2020-03-20 18:20:59 +00:00
## indexOf(arr, x) {#indexofarr-x}
2018-11-10 20:00:22 +00:00
2018-07-26 14:41:59 +00:00
Возвращает индекс первого элемента x (начиная с 1), если он есть в массиве, или 0, если е г о нет.
Пример:
2020-03-20 18:20:59 +00:00
``` sql
2018-07-26 14:41:59 +00:00
SELECT indexOf([1, 3, NULL, NULL], NULL)
2019-09-23 15:31:46 +00:00
```
2020-03-20 18:20:59 +00:00
``` text
2018-07-26 14:41:59 +00:00
┌─indexOf([1, 3, NULL, NULL], NULL)─┐
│ 3 │
└───────────────────────────────────┘
```
Элементы, равные `NULL` , обрабатываются как обычные значения.
2017-03-12 17:58:51 +00:00
2020-03-20 18:20:59 +00:00
## countEqual(arr, x) {#countequalarr-x}
2018-11-10 20:00:22 +00:00
2020-03-20 18:20:59 +00:00
Возвращает количество элементов массива, равных x. Эквивалентно arrayCount(elem -\> elem = x, arr).
2018-07-26 14:41:59 +00:00
2018-11-10 20:00:22 +00:00
`NULL` обрабатывается как значение.
2018-07-26 14:41:59 +00:00
Пример:
2020-03-20 18:20:59 +00:00
``` sql
2018-07-26 14:41:59 +00:00
SELECT countEqual([1, 2, NULL, NULL], NULL)
2019-09-23 15:31:46 +00:00
```
2020-03-20 18:20:59 +00:00
``` text
2018-07-26 14:41:59 +00:00
┌─countEqual([1, 2, NULL, NULL], NULL)─┐
│ 2 │
└──────────────────────────────────────┘
```
2020-03-22 09:14:59 +00:00
## arrayEnumerate(arr) {#array_functions-arrayenumerate}
2018-11-10 20:00:22 +00:00
2020-03-20 18:20:59 +00:00
Возвращает массив \[1, 2, 3, …, length(arr)\]
2017-03-12 17:58:51 +00:00
Эта функция обычно используется совместно с ARRAY JOIN. Она позволяет, после применения ARRAY JOIN, посчитать что-либо только один раз для каждого массива. Пример:
2020-03-20 18:20:59 +00:00
``` sql
2017-10-25 05:27:09 +00:00
SELECT
count() AS Reaches,
countIf(num = 1) AS Hits
FROM test.hits
ARRAY JOIN
GoalsReached,
arrayEnumerate(GoalsReached) AS num
WHERE CounterID = 160656
LIMIT 10
```
2020-03-20 18:20:59 +00:00
``` text
2017-10-25 05:27:09 +00:00
┌─Reaches─┬──Hits─┐
│ 95606 │ 31406 │
└─────────┴───────┘
```
2017-03-12 17:58:51 +00:00
В этом примере, Reaches - число достижений целей (строк, получившихся после применения ARRAY JOIN), а Hits - число хитов (строк, которые были до ARRAY JOIN). В данном случае, тот же результат можно получить проще:
2020-03-20 18:20:59 +00:00
``` sql
2017-10-25 05:27:09 +00:00
SELECT
sum(length(GoalsReached)) AS Reaches,
count() AS Hits
FROM test.hits
WHERE (CounterID = 160656) AND notEmpty(GoalsReached)
```
2017-06-07 01:58:21 +00:00
2020-03-20 18:20:59 +00:00
``` text
2017-10-25 05:27:09 +00:00
┌─Reaches─┬──Hits─┐
│ 95606 │ 31406 │
└─────────┴───────┘
```
2017-03-12 17:58:51 +00:00
Также эта функция может быть использована в функциях высшего порядка. Например, с её помощью можно достать индексы массива для элементов, удовлетворяющих некоторому условию.
2020-03-20 18:20:59 +00:00
## arrayEnumerateUniq(arr, …) {#arrayenumerateuniqarr}
2018-11-10 20:00:22 +00:00
2017-03-12 17:58:51 +00:00
Возвращает массив, такого же размера, как исходный, где для каждого элемента указано, какой он по счету среди элементов с таким же значением.
2017-10-25 05:27:09 +00:00
Например: arrayEnumerateUniq(\[10, 20, 10, 30\]) = \[1, 1, 2, 1\].
2017-03-12 17:58:51 +00:00
2017-06-07 01:58:21 +00:00
Эта функция полезна при использовании ARRAY JOIN и агрегации по элементам массива.
2017-03-12 17:58:51 +00:00
Пример:
2020-03-20 18:20:59 +00:00
``` sql
2017-10-25 05:27:09 +00:00
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
```
2020-03-20 18:20:59 +00:00
``` text
2017-10-25 05:27:09 +00:00
┌──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 │
└─────────┴─────────┴────────┘
```
2017-03-12 17:58:51 +00:00
В этом примере, для каждого идентификатора цели, посчитано количество достижений целей (каждый элемент вложенной структуры данных Goals является достижением целей) и количество визитов. Если бы не было ARRAY JOIN, мы бы считали количество визитов как sum(Sign). Н о в данном случае, строчки были размножены по вложенной структуре Goals, и чтобы после этого учесть каждый визит один раз, мы поставили условие на значение функции arrayEnumerateUniq(Goals.ID).
Функция arrayEnumerateUniq может принимать несколько аргументов - массивов одинаковых размеров. В этом случае, уникальность считается для кортежей элементов на одинаковых позициях всех массивов.
2020-03-20 18:20:59 +00:00
``` sql
2017-10-25 05:27:09 +00:00
SELECT arrayEnumerateUniq([1, 1, 1, 2, 2, 2], [1, 1, 2, 1, 1, 2]) AS res
```
2017-06-13 04:15:47 +00:00
2020-03-20 18:20:59 +00:00
``` text
2017-10-25 05:27:09 +00:00
┌─res───────────┐
│ [1,2,1,1,2,1] │
└───────────────┘
```
2017-03-12 17:58:51 +00:00
Это нужно при использовании ARRAY JOIN с вложенной структурой данных и затем агрегации по нескольким элементам этой структуры.
2020-03-20 18:20:59 +00:00
## arrayPopBack {#arraypopback}
2017-11-22 06:14:09 +00:00
Удаляет последний элемент из массива.
2020-03-20 18:20:59 +00:00
``` sql
2017-11-22 06:14:09 +00:00
arrayPopBack(array)
```
2018-11-10 20:00:22 +00:00
**Параметры**
2017-11-22 06:14:09 +00:00
2020-03-21 04:11:51 +00:00
- `array` - Массив.
2017-11-22 06:14:09 +00:00
**Пример**
2020-03-20 18:20:59 +00:00
``` sql
2017-11-22 06:14:09 +00:00
SELECT arrayPopBack([1, 2, 3]) AS res
```
2020-03-20 18:20:59 +00:00
2019-09-23 15:31:46 +00:00
text
2017-11-22 06:14:09 +00:00
2020-03-21 04:11:51 +00:00
┌─res───┐
│ [1,2] │
└───────┘
2020-03-20 18:20:59 +00:00
## arrayPopFront {#arraypopfront}
2017-11-22 06:14:09 +00:00
Удаляет первый элемент из массива.
2020-03-20 18:20:59 +00:00
``` sql
2017-11-22 06:14:09 +00:00
arrayPopFront(array)
```
2018-11-10 20:00:22 +00:00
**Параметры**
2017-11-22 06:14:09 +00:00
2020-03-21 04:11:51 +00:00
- `array` - Массив.
2017-11-22 06:14:09 +00:00
**Пример**
2020-03-20 18:20:59 +00:00
``` sql
2017-11-22 06:14:09 +00:00
SELECT arrayPopFront([1, 2, 3]) AS res
```
2018-11-10 20:00:22 +00:00
2020-03-20 18:20:59 +00:00
``` text
2017-11-22 06:14:09 +00:00
┌─res───┐
│ [2,3] │
└───────┘
```
2020-03-20 18:20:59 +00:00
## arrayPushBack {#arraypushback}
2017-11-22 06:14:09 +00:00
Добавляет один элемент в конец массива.
2020-03-20 18:20:59 +00:00
``` sql
2017-11-22 06:14:09 +00:00
arrayPushBack(array, single_value)
```
2018-11-10 20:00:22 +00:00
**Параметры**
2017-11-22 06:14:09 +00:00
2020-03-21 04:11:51 +00:00
- `array` - Массив.
- `single_value` - Одиночное значение. В массив с числам можно добавить только числа, в массив с о строками только строки. При добавлении чисел ClickHouse автоматически приводит тип `single_value` к типу данных массива. Подробнее о типах данных в ClickHouse читайте в разделе «[Типы данных](../../data_types/index.md#data_types)». Может быть равно `NULL` . Функция добавит элемент `NULL` в массив, а тип элементов массива преобразует в `Nullable` .
2017-11-22 06:14:09 +00:00
**Пример**
2020-03-20 18:20:59 +00:00
``` sql
2017-11-22 06:14:09 +00:00
SELECT arrayPushBack(['a'], 'b') AS res
```
2018-11-10 20:00:22 +00:00
2020-03-20 18:20:59 +00:00
``` text
2017-11-22 06:14:09 +00:00
┌─res───────┐
│ ['a','b'] │
└───────────┘
```
2020-03-20 18:20:59 +00:00
## arrayPushFront {#arraypushfront}
2017-11-22 06:14:09 +00:00
Добавляет один элемент в начало массива.
2020-03-20 18:20:59 +00:00
``` sql
2017-11-22 06:14:09 +00:00
arrayPushFront(array, single_value)
```
2018-11-10 20:00:22 +00:00
**Параметры**
2017-11-22 06:14:09 +00:00
2020-03-21 04:11:51 +00:00
- `array` - Массив.
- `single_value` - Одиночное значение. В массив с числам можно добавить только числа, в массив с о строками только строки. При добавлении чисел ClickHouse автоматически приводит тип `single_value` к типу данных массива. Подробнее о типах данных в ClickHouse читайте в разделе «[Типы данных](../../data_types/index.md#data_types)». Может быть равно `NULL` . Функция добавит элемент `NULL` в массив, а тип элементов массива преобразует в `Nullable` .
2017-11-22 06:14:09 +00:00
**Пример**
2020-03-20 18:20:59 +00:00
``` sql
2019-12-13 14:31:13 +00:00
SELECT arrayPushFront(['b'], 'a') AS res
2017-11-22 06:14:09 +00:00
```
2018-11-10 20:00:22 +00:00
2020-03-20 18:20:59 +00:00
``` text
2017-11-22 06:14:09 +00:00
┌─res───────┐
│ ['a','b'] │
└───────────┘
```
2020-03-20 18:20:59 +00:00
## arrayResize {#arrayresize}
2018-07-26 14:41:59 +00:00
Изменяет длину массива.
2020-03-20 18:20:59 +00:00
``` sql
2018-07-26 14:41:59 +00:00
arrayResize(array, size[, extender])
```
2018-11-10 20:00:22 +00:00
**Параметры**
2018-07-26 14:41:59 +00:00
2020-03-21 04:11:51 +00:00
- `array` — массив.
- `size` — необходимая длина массива.
- Если `size` меньше изначального размера массива, то массив обрезается справа.
- Если `size` больше изначального размера массива, массив дополняется справа значениями `extender` или значениями по умолчанию для типа данных элементов массива.
- `extender` — значение для дополнения массива. Может быть `NULL` .
2018-07-26 14:41:59 +00:00
**Возвращаемое значение:**
Массив длины `size` .
**Примеры вызовов**
2020-03-20 18:20:59 +00:00
``` sql
2018-07-26 14:41:59 +00:00
SELECT arrayResize([1], 3)
2019-09-23 15:31:46 +00:00
```
2020-03-20 18:20:59 +00:00
``` text
2018-07-26 14:41:59 +00:00
┌─arrayResize([1], 3)─┐
│ [1,0,0] │
└─────────────────────┘
```
2018-11-10 20:00:22 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2018-07-26 14:41:59 +00:00
SELECT arrayResize([1], 3, NULL)
2019-09-23 15:31:46 +00:00
```
2020-03-20 18:20:59 +00:00
``` text
2018-07-26 14:41:59 +00:00
┌─arrayResize([1], 3, NULL)─┐
│ [1,NULL,NULL] │
└───────────────────────────┘
```
2020-03-20 18:20:59 +00:00
## arraySlice {#arrayslice}
2017-11-22 06:14:09 +00:00
Возвращает срез массива.
2020-03-20 18:20:59 +00:00
``` sql
2017-11-24 09:52:25 +00:00
arraySlice(array, offset[, length])
2017-11-22 06:14:09 +00:00
```
2018-11-10 20:00:22 +00:00
**Параметры**
2017-11-22 06:14:09 +00:00
2020-03-21 04:11:51 +00:00
- `array` - Массив данных.
- `offset` - Отступ от края массива. Положительное значение - отступ слева, отрицательное значение - отступ справа. Отсчет элементов массива начинается с 1.
- `length` - Длина необходимого среза. Если указать отрицательное значение, то функция вернёт открытый срез `[offset, array_length - length)` . Если не указать значение, то функция вернёт срез `[offset, the_end_of_array]` .
2017-11-22 06:14:09 +00:00
**Пример**
2020-03-20 18:20:59 +00:00
``` sql
2018-07-26 14:41:59 +00:00
SELECT arraySlice([1, 2, NULL, 4, 5], 2, 3) AS res
2017-11-22 06:14:09 +00:00
```
2018-11-10 20:00:22 +00:00
2020-03-20 18:20:59 +00:00
``` text
2018-07-26 14:41:59 +00:00
┌─res────────┐
│ [2,NULL,4] │
└────────────┘
2017-11-22 06:14:09 +00:00
```
2018-07-26 14:41:59 +00:00
Элементы массива равные `NULL` обрабатываются как обычные значения.
2017-11-22 06:14:09 +00:00
2020-03-22 09:14:59 +00:00
## arraySort(\[func,\] arr, …) {#array_functions-sort}
2019-04-19 15:18:57 +00:00
2019-04-23 19:43:20 +00:00
Возвращает массив `arr` , отсортированный в восходящем порядке. Если задана функция `func` , то порядок сортировки определяется результатом применения этой функции на элементы массива `arr` . Если `func` принимает несколько аргументов, то в функцию `arraySort` нужно передавать несколько массивов, которые будут соответствовать аргументам функции `func` . Подробные примеры рассмотрены в конце описания `arraySort` .
2019-04-19 15:18:57 +00:00
2019-04-23 12:56:22 +00:00
Пример сортировки целочисленных значений:
2019-04-19 15:18:57 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2019-04-19 15:18:57 +00:00
SELECT arraySort([1, 3, 3, 0])
```
2020-03-20 18:20:59 +00:00
``` text
2019-04-19 15:18:57 +00:00
┌─arraySort([1, 3, 3, 0])─┐
│ [0,1,3,3] │
└─────────────────────────┘
```
2019-04-23 12:56:22 +00:00
Пример сортировки строковых значений:
2019-04-19 15:55:23 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2019-04-19 15:55:23 +00:00
SELECT arraySort(['hello', 'world', '!'])
```
2020-03-20 18:20:59 +00:00
``` text
2019-04-19 15:55:23 +00:00
┌─arraySort(['hello', 'world', '!'])─┐
│ ['!','hello','world'] │
└────────────────────────────────────┘
```
2019-04-23 12:56:22 +00:00
Значения `NULL` , `NaN` и `Inf` сортируются по следующему принципу:
2020-03-20 18:20:59 +00:00
``` sql
2019-04-23 12:56:22 +00:00
SELECT arraySort([1, nan, 2, NULL, 3, nan, -4, NULL, inf, -inf]);
```
2020-03-20 18:20:59 +00:00
``` text
2019-04-23 12:56:22 +00:00
┌─arraySort([1, nan, 2, NULL, 3, nan, -4, NULL, inf, -inf])─┐
│ [-inf,-4,1,2,3,inf,nan,nan,NULL,NULL] │
└───────────────────────────────────────────────────────────┘
```
2020-03-21 04:11:51 +00:00
- Значения `-Inf` идут в начале массива.
- Значения `NULL` идут в конце массива.
- Значения `NaN` идут перед `NULL` .
- Значения `Inf` идут перед `NaN` .
2019-04-23 12:56:22 +00:00
2019-04-23 19:43:20 +00:00
Функция `arraySort` является [функцией высшего порядка ](higher_order_functions.md ) — в качестве первого аргумента ей можно передать лямбда-функцию. В этом случае порядок сортировки определяется результатом применения лямбда-функции на элементы массива.
2020-03-20 18:20:59 +00:00
Рассмотрим пример:
2019-04-19 15:18:57 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2019-04-23 19:43:20 +00:00
SELECT arraySort((x) -> -x, [1, 2, 3]) as res;
```
2020-03-20 18:20:59 +00:00
``` text
2019-04-23 19:43:20 +00:00
┌─res─────┐
│ [3,2,1] │
└─────────┘
```
2020-03-20 18:20:59 +00:00
Для каждого элемента исходного массива лямбда-функция возвращает ключ сортировки, то есть \[1 – \> -1, 2 – \> -2, 3 – \> -3\]. Так как `arraySort` сортирует элементы в порядке возрастания ключей, результат будет \[3, 2, 1\]. Как можно заметить, функция `x – > -x` устанавливает [обратный порядок сортировки ](#array_functions-reverse-sort ).
2019-04-23 19:43:20 +00:00
2019-04-24 21:08:49 +00:00
Лямбда-функция может принимать несколько аргументов. В этом случае, в функцию `arraySort` нужно передавать несколько массивов, которые будут соответствовать аргументам лямбда-функции (массивы должны быть одинаковой длины). Следует иметь в виду, что результат будет содержать элементы только из первого массива; элементы из всех последующих массивов будут задавать ключи сортировки. Например:
2019-04-23 19:43:20 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2019-04-23 19:43:20 +00:00
SELECT arraySort((x, y) -> y, ['hello', 'world'], [2, 1]) as res;
2019-04-19 15:18:57 +00:00
```
2019-04-23 12:56:22 +00:00
2020-03-20 18:20:59 +00:00
``` text
2019-04-23 12:56:22 +00:00
┌─res────────────────┐
│ ['world', 'hello'] │
└────────────────────┘
2019-04-19 15:18:57 +00:00
```
2020-03-20 18:20:59 +00:00
Элементы, указанные во втором массиве (\[2,1\]), определяют ключ сортировки для элементов из исходного массива (\[‘ hello’ , ‘ world’ \]), то есть \[‘ hello’ – \> 2, ‘ world’ – \> 1\]. Так как лямбда-функция не использует `x` , элементы исходного массива не влияют на порядок сортировки. Таким образом, ‘ hello’ будет вторым элементом в отсортированном массиве, а ‘ world’ — первым.
2019-04-23 12:56:22 +00:00
2019-04-23 19:54:32 +00:00
Ниже приведены другие примеры.
2019-04-23 12:56:22 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2019-04-23 19:43:20 +00:00
SELECT arraySort((x, y) -> y, [0, 1, 2], ['c', 'b', 'a']) as res;
2019-04-23 12:56:22 +00:00
```
2020-03-20 18:20:59 +00:00
``` text
2019-04-23 12:56:22 +00:00
┌─res─────┐
2019-04-23 19:43:20 +00:00
│ [2,1,0] │
2019-04-23 12:56:22 +00:00
└─────────┘
```
2020-03-20 18:20:59 +00:00
``` sql
2019-04-23 19:54:32 +00:00
SELECT arraySort((x, y) -> -y, [0, 1, 2], [1, 2, 3]) as res;
```
2020-03-20 18:20:59 +00:00
``` text
2019-04-23 19:54:32 +00:00
┌─res─────┐
│ [2,1,0] │
└─────────┘
```
2019-04-23 12:56:22 +00:00
2019-04-23 19:43:20 +00:00
!!! note "Примечание"
2019-04-24 21:08:49 +00:00
Для улучшения эффективности сортировки применяется [преобразование Шварца ](https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A8%D0%B2%D0%B0%D1%80%D1%86%D0%B0 ).
2019-04-19 15:18:57 +00:00
2020-03-22 09:14:59 +00:00
## arrayReverseSort(\[func,\] arr, …) {#array_functions-reverse-sort}
2019-04-19 15:18:57 +00:00
2019-04-23 19:43:20 +00:00
Возвращает массив `arr` , отсортированный в нисходящем порядке. Если указана функция `func` , то массив `arr` сначала сортируется в порядке, который определяется функцией `func` , а затем отсортированный массив переворачивается. Если функция `func` принимает несколько аргументов, то в функцию `arrayReverseSort` необходимо передавать несколько массивов, которые будут соответствовать аргументам функции `func` . Подробные примеры рассмотрены в конце описания функции `arrayReverseSort` .
2020-03-20 18:20:59 +00:00
2019-04-23 12:56:22 +00:00
Пример сортировки целочисленных значений:
2020-03-20 18:20:59 +00:00
``` sql
2019-04-23 12:56:22 +00:00
SELECT arrayReverseSort([1, 3, 3, 0]);
2019-04-19 15:55:23 +00:00
```
2020-03-20 18:20:59 +00:00
``` text
2019-04-19 15:55:23 +00:00
┌─arrayReverseSort([1, 3, 3, 0])─┐
│ [3,3,1,0] │
└────────────────────────────────┘
```
2019-04-23 12:56:22 +00:00
Пример сортировки строковых значений:
2019-04-19 15:55:23 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2019-04-23 12:56:22 +00:00
SELECT arrayReverseSort(['hello', 'world', '!']);
2019-04-19 15:55:23 +00:00
```
2020-03-20 18:20:59 +00:00
``` text
2019-04-19 15:55:23 +00:00
┌─arrayReverseSort(['hello', 'world', '!'])─┐
│ ['world','hello','!'] │
└───────────────────────────────────────────┘
2020-03-20 18:20:59 +00:00
```
2019-04-19 15:18:57 +00:00
2019-04-23 12:56:22 +00:00
Значения `NULL` , `NaN` и `Inf` сортируются в следующем порядке:
2020-03-20 18:20:59 +00:00
``` sql
2019-04-23 12:56:22 +00:00
SELECT arrayReverseSort([1, nan, 2, NULL, 3, nan, -4, NULL, inf, -inf]) as res;
```
2020-03-20 18:20:59 +00:00
``` text
2019-04-23 12:56:22 +00:00
┌─res───────────────────────────────────┐
│ [inf,3,2,1,-4,-inf,nan,nan,NULL,NULL] │
└───────────────────────────────────────┘
```
2020-03-21 04:11:51 +00:00
- Значения `Inf` идут в начале массива.
- Значения `NULL` идут в конце массива.
- Значения `NaN` идут перед `NULL` .
- Значения `-Inf` идут перед `NaN` .
2019-04-23 12:56:22 +00:00
Функция `arrayReverseSort` является [функцией высшего порядка ](higher_order_functions.md ). Вы можете передать ей в качестве первого аргумента лямбда-функцию. Например:
2020-03-20 18:20:59 +00:00
``` sql
2019-04-24 21:08:49 +00:00
SELECT arrayReverseSort((x) -> -x, [1, 2, 3]) as res;
```
2020-03-20 18:20:59 +00:00
``` text
2019-04-24 21:08:49 +00:00
┌─res─────┐
│ [1,2,3] │
└─────────┘
```
В этом примере, порядок сортировки устанавливается следующим образом:
2020-03-20 18:20:59 +00:00
1. Сначала исходный массив (\[1, 2, 3\]) сортируется в том порядке, который определяется лямбда-функцией. Результатом будет массив \[3, 2, 1\].
2. Массив, который был получен на предыдущем шаге, переворачивается. Т о есть, получается массив \[1, 2, 3\].
2019-04-24 21:08:49 +00:00
Лямбда-функция может принимать на вход несколько аргументов. В этом случае, в функцию `arrayReverseSort` нужно передавать несколько массивов, которые будут соответствовать аргументам лямбда-функции (массивы должны быть одинаковой длины). Следует иметь в виду, что результат будет содержать элементы только из первого массива; элементы из всех последующих массивов будут определять ключи сортировки. Например:
2020-03-20 18:20:59 +00:00
``` sql
2019-04-23 12:56:22 +00:00
SELECT arrayReverseSort((x, y) -> y, ['hello', 'world'], [2, 1]) as res;
2019-04-19 15:18:57 +00:00
```
2020-03-20 18:20:59 +00:00
``` text
2019-04-23 12:56:22 +00:00
┌─res───────────────┐
│ ['hello','world'] │
└───────────────────┘
2019-04-19 15:18:57 +00:00
```
2019-04-23 12:56:22 +00:00
2019-04-24 21:08:49 +00:00
В этом примере, массив сортируется следующим образом:
2019-04-23 12:56:22 +00:00
2020-03-20 18:20:59 +00:00
1. Сначала массив сортируется в том порядке, который определяется лямбда-функцией. Элементы, указанные во втором массиве (\[2,1\]), определяют ключи сортировки соответствующих элементов из исходного массива (\[‘ hello’ , ‘ world’ \]). Т о есть, будет массив \[‘ world’ , ‘ hello’ \].
2. Массив, который был отсортирован на предыдущем шаге, переворачивается. Получается массив \[‘ hello’ , ‘ world’ \].
2019-04-23 12:56:22 +00:00
2019-04-23 19:54:32 +00:00
Ниже приведены ещё примеры.
2019-04-23 12:56:22 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2019-04-23 19:43:20 +00:00
SELECT arrayReverseSort((x, y) -> y, [0, 1, 2], ['c', 'b', 'a']) as res;
2019-04-23 12:56:22 +00:00
```
2020-03-20 18:20:59 +00:00
``` text
2019-04-23 12:56:22 +00:00
┌─res─────┐
2019-04-23 19:43:20 +00:00
│ [0,1,2] │
2019-04-23 12:56:22 +00:00
└─────────┘
2019-04-19 15:18:57 +00:00
```
2020-03-20 18:20:59 +00:00
``` sql
2019-04-23 19:54:32 +00:00
SELECT arrayReverseSort((x, y) -> -y, [4, 3, 5], [1, 2, 3]) AS res;
```
2020-03-20 18:20:59 +00:00
``` text
2019-04-23 19:54:32 +00:00
┌─res─────┐
│ [4,3,5] │
└─────────┘
```
2019-04-19 15:18:57 +00:00
2020-03-20 18:20:59 +00:00
## arrayUniq(arr, …) {#array-functions-arrayuniq}
2018-11-10 20:00:22 +00:00
2017-03-12 17:58:51 +00:00
Если передан один аргумент, считает количество разных элементов в массиве.
Если передано несколько аргументов, считает количество разных кортежей из элементов на соответствующих позициях в нескольких массивах.
2020-03-20 18:20:59 +00:00
Если необходимо получить список уникальных элементов массива, можно воспользоваться arrayReduce(‘ groupUniqArray’ , arr).
2017-03-12 17:58:51 +00:00
2020-03-20 18:20:59 +00:00
## arrayJoin(arr) {#array-functions-arrayjoin}
2018-11-10 20:00:22 +00:00
2020-03-20 18:20:59 +00:00
Особенная функция. Смотрите раздел [«Функция arrayJoin» ](array_join.md#functions_arrayjoin ).
2018-10-16 10:47:17 +00:00
2019-11-17 18:10:32 +00:00
## arrayDifference {#arraydifference}
2019-09-28 06:39:25 +00:00
2020-02-02 22:41:39 +00:00
Вычисляет разность между соседними элементами массива. Возвращает массив, где первым элементом будет 0, вторым – разность `a[1] - a[0]` и т. д. Тип элементов результирующего массива определяется правилами вывода типов при вычитании (напр. `UInt8` - `UInt8` = `Int16` ).
2019-09-28 06:39:25 +00:00
2020-03-20 18:20:59 +00:00
**Синтаксис**
2019-11-17 18:10:32 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2019-11-17 18:10:32 +00:00
arrayDifference(array)
```
2020-03-20 18:20:59 +00:00
**Параметры**
2019-11-17 18:10:32 +00:00
2020-03-21 04:11:51 +00:00
- `array` – [Массив ](https://clickhouse.yandex/docs/ru/data_types/array/ ).
2019-11-17 18:10:32 +00:00
**Возвращаемое значение**
Возвращает массив разностей между соседними элементами.
**Пример**
Запрос:
2019-09-28 06:39:25 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2019-09-28 06:39:25 +00:00
SELECT arrayDifference([1, 2, 3, 4])
```
2019-11-17 18:10:32 +00:00
Ответ:
2020-03-20 18:20:59 +00:00
``` text
2019-09-28 06:39:25 +00:00
┌─arrayDifference([1, 2, 3, 4])─┐
│ [0,1,1,1] │
└───────────────────────────────┘
```
2019-11-17 18:10:32 +00:00
Пример переполнения из-за результирующего типа `Int64` :
Запрос:
2019-09-28 06:39:25 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2019-09-28 06:39:25 +00:00
SELECT arrayDifference([0, 10000000000000000000])
```
2019-11-17 18:10:32 +00:00
Ответ:
2020-03-20 18:20:59 +00:00
``` text
2019-09-28 06:39:25 +00:00
┌─arrayDifference([0, 10000000000000000000])─┐
│ [0,-8446744073709551616] │
└────────────────────────────────────────────┘
```
2019-11-17 18:10:32 +00:00
## arrayDistinct {#arraydistinct}
2019-09-28 06:39:25 +00:00
2019-11-17 18:10:32 +00:00
Принимает массив, возвращает массив, содержащий уникальные элементы.
2019-09-28 06:39:25 +00:00
2020-03-20 18:20:59 +00:00
**Синтаксис**
``` sql
2019-11-17 18:10:32 +00:00
arrayDistinct(array)
```
**Параметры**
2020-03-21 04:11:51 +00:00
- `array` – [Массив ](https://clickhouse.yandex/docs/ru/data_types/array/ ).
2019-11-17 18:10:32 +00:00
**Возвращаемое значение**
2020-02-02 22:41:39 +00:00
Возвращает массив, содержащий только уникальные элементы исходного массива.
2019-11-17 18:10:32 +00:00
**Пример**
Запрос:
2019-09-28 06:39:25 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2019-09-28 06:39:25 +00:00
SELECT arrayDistinct([1, 2, 2, 3, 1])
```
2019-11-17 18:10:32 +00:00
Ответ:
2020-03-20 18:20:59 +00:00
``` text
2019-09-28 06:39:25 +00:00
┌─arrayDistinct([1, 2, 2, 3, 1])─┐
│ [1,2,3] │
└────────────────────────────────┘
```
2020-03-22 09:14:59 +00:00
## arrayEnumerateDense(arr) {#array_functions-arrayenumeratedense}
2019-09-28 06:39:25 +00:00
Возвращает массив того же размера, что и исходный массив, с индексами исходного массива, указывающими, где каждый элемент впервые появляется в исходном массиве.
Пример:
2020-03-20 18:20:59 +00:00
``` sql
2019-09-28 06:39:25 +00:00
SELECT arrayEnumerateDense([10, 20, 10, 30])
```
2020-03-20 18:20:59 +00:00
``` text
2019-09-28 06:39:25 +00:00
┌─arrayEnumerateDense([10, 20, 10, 30])─┐
│ [1,2,1,3] │
└───────────────────────────────────────┘
```
2020-03-20 18:20:59 +00:00
## arrayIntersect(arr) {#array-functions-arrayintersect}
2019-09-28 06:39:25 +00:00
Принимает несколько массивов, возвращает массив с элементами, присутствующими во всех исходных массивах. Элементы на выходе следуют в порядке следования в первом массиве.
Пример:
2020-03-20 18:20:59 +00:00
``` sql
2019-09-28 06:39:25 +00:00
SELECT
arrayIntersect([1, 2], [1, 3], [2, 3]) AS no_intersect,
arrayIntersect([1, 2], [1, 3], [1, 4]) AS intersect
```
2020-03-20 18:20:59 +00:00
``` text
2019-09-28 06:39:25 +00:00
┌─no_intersect─┬─intersect─┐
│ [] │ [1] │
└──────────────┴───────────┘
```
2020-03-20 18:20:59 +00:00
## arrayReduce(agg\_func, arr1, …) {#array-functions-arrayreduce}
2019-09-28 06:39:25 +00:00
Применяет агрегатную функцию к элементам массива и возвращает е е результат. Имя агрегирующей функции передается как строка в одинарных кавычках `'max'` , `'sum'` . При использовании параметрических агрегатных функций, параметр указывается после имени функции в круглых скобках `'uniqUpTo(6)'` .
Пример:
2020-03-20 18:20:59 +00:00
``` sql
2019-09-28 06:39:25 +00:00
SELECT arrayReduce('max', [1, 2, 3])
```
2020-03-20 18:20:59 +00:00
``` text
2019-09-28 06:39:25 +00:00
┌─arrayReduce('max', [1, 2, 3])─┐
│ 3 │
└───────────────────────────────┘
```
Если агрегатная функция имеет несколько аргументов, то эту функцию можно применять к нескольким массивам одинакового размера.
Пример:
2020-03-20 18:20:59 +00:00
``` sql
2019-09-28 06:39:25 +00:00
SELECT arrayReduce('maxIf', [3, 5], [1, 0])
```
2020-03-20 18:20:59 +00:00
``` text
2019-09-28 06:39:25 +00:00
┌─arrayReduce('maxIf', [3, 5], [1, 0])─┐
│ 3 │
└──────────────────────────────────────┘
```
Пример с параметрической агрегатной функцией:
2020-03-20 18:20:59 +00:00
``` sql
2019-09-28 06:39:25 +00:00
SELECT arrayReduce('uniqUpTo(3)', [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
```
2020-03-20 18:20:59 +00:00
``` text
2019-09-28 06:39:25 +00:00
┌─arrayReduce('uniqUpTo(3)', [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])─┐
│ 4 │
└─────────────────────────────────────────────────────────────┘
```
2020-03-22 09:14:59 +00:00
## arrayReverse(arr) {#array_functions-arrayreverse}
2019-09-28 06:39:25 +00:00
Возвращает массив того же размера, что и исходный массив, содержащий элементы в обратном порядке.
Пример:
2020-03-20 18:20:59 +00:00
``` sql
2019-09-28 06:39:25 +00:00
SELECT arrayReverse([1, 2, 3])
```
2020-03-20 18:20:59 +00:00
``` text
2019-09-28 06:39:25 +00:00
┌─arrayReverse([1, 2, 3])─┐
│ [3,2,1] │
└─────────────────────────┘
```
2020-03-20 18:20:59 +00:00
## reverse(arr) {#array-functions-reverse}
2019-09-28 06:39:25 +00:00
2020-03-20 18:20:59 +00:00
Синоним для [«arrayReverse» ](#array_functions-arrayreverse )
2019-09-28 06:39:25 +00:00
2019-12-24 15:10:21 +00:00
## arrayFlatten {#arrayflatten}
Преобразует массив массивов в плоский массив.
Функция:
2020-03-21 04:11:51 +00:00
- Оперирует с массивами любой вложенности.
- Н е изменяет массив, если он уже плоский.
2019-12-24 15:10:21 +00:00
Результирующий массив содержит все элементы исходных массивов.
2020-03-20 18:20:59 +00:00
**Синтаксис**
2019-12-24 15:10:21 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2019-12-24 15:10:21 +00:00
flatten(array_of_arrays)
```
Синоним: `flatten` .
**Параметры**
2020-03-21 04:11:51 +00:00
- `array_of_arrays` — [Массивов ](../../data_types/array.md ) массивов. Например, `[[1,2,3], [4,5]]` .
2019-12-24 15:10:21 +00:00
**Примеры**
2020-03-20 18:20:59 +00:00
``` sql
2019-12-24 15:10:21 +00:00
SELECT flatten([[[1]], [[2], [3]]])
```
2020-03-20 18:20:59 +00:00
``` text
2019-12-24 15:10:21 +00:00
┌─flatten(array(array([1]), array([2], [3])))─┐
│ [1,2,3] │
└─────────────────────────────────────────────┘
```
2019-11-26 12:46:18 +00:00
## arrayCompact {#arraycompact}
Удаляет дубликаты из массива. Порядок результирующих значений определяется порядком в исходном массиве.
**Синтаксис**
2020-03-20 18:20:59 +00:00
``` sql
2019-11-26 12:46:18 +00:00
arrayCompact(arr)
```
**Параметры**
`arr` — [Массив ](../../data_types/array.md ) для обхода.
**Возвращаемое значение**
Массив без дубликатов.
Тип: `Array` .
**Пример**
Запрос:
2020-03-20 18:20:59 +00:00
``` sql
2019-11-26 12:46:18 +00:00
SELECT arrayCompact([1, 1, nan, nan, 2, 3, 3, 3])
```
Ответ:
2020-03-20 18:20:59 +00:00
``` text
2019-11-26 12:46:18 +00:00
┌─arrayCompact([1, 1, nan, nan, 2, 3, 3, 3])─┐
│ [1,nan,nan,2,3] │
└────────────────────────────────────────────┘
```
2020-01-30 10:34:55 +00:00
[Оригинальная статья ](https://clickhouse.tech/docs/ru/query_language/functions/array_functions/ ) <!--hide-->