2017-11-22 06:14:09 +00:00
# Функции по работе с массивами
2017-03-12 17:58:51 +00:00
2017-11-22 06:14:09 +00:00
## empty
2017-03-12 17:58:51 +00:00
Возвращает 1 для пустого массива, и 0 для непустого массива.
Тип результата - UInt8.
Функция также работает для строк.
2017-11-22 06:14:09 +00:00
## notEmpty
2017-03-12 17:58:51 +00:00
Возвращает 0 для пустого массива, и 1 для непустого массива.
Тип результата - UInt8.
Функция также работает для строк.
2017-11-22 06:14:09 +00:00
## length
2017-03-12 17:58:51 +00:00
Возвращает количество элементов в массиве.
Тип результата - UInt64.
Функция также работает для строк.
2017-11-22 06:14:09 +00:00
## emptyArrayUInt8, emptyArrayUInt16, emptyArrayUInt32, emptyArrayUInt64
2017-03-12 17:58:51 +00:00
2017-11-22 06:14:09 +00:00
## emptyArrayInt8, emptyArrayInt16, emptyArrayInt32, emptyArrayInt64
2017-03-12 17:58:51 +00:00
2017-11-22 06:14:09 +00:00
## emptyArrayFloat32, emptyArrayFloat64
2017-03-12 17:58:51 +00:00
2017-11-22 06:14:09 +00:00
## emptyArrayDate, emptyArrayDateTime
2017-03-12 17:58:51 +00:00
2017-11-22 06:14:09 +00:00
## emptyArrayString
2017-03-12 17:58:51 +00:00
Принимает ноль аргументов и возвращает пустой массив соответствующего типа.
2017-11-22 06:14:09 +00:00
## emptyArrayToSingle
2017-03-12 17:58:51 +00:00
Принимает пустой массив и возвращает массив из одного элемента, равного значению по умолчанию.
2017-11-22 06:14:09 +00:00
## range(N)
2017-03-12 17:58:51 +00:00
Возвращает массив чисел от 0 до N-1.
Н а всякий случай, если на блок данных, создаются массивы суммарной длины больше 100 000 000 элементов, то кидается исключение.
2017-11-22 06:14:09 +00:00
## array(x1, ...), оператор \[x1, ...\]
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 - наименьший общий тип от переданных аргументов.
2017-11-22 06:14:09 +00:00
## 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\]
2017-03-12 17:58:51 +00:00
Достаёт элемент с индексом n из массива arr.
n должен быть любым целочисленным типом.
Индексы в массиве начинаются с единицы.
2017-10-25 05:27:09 +00:00
Поддерживаются отрицательные индексы - в этом случае, будет выбран соответствующий по номеру элемент с конца. Например, arr\[-1\] - последний элемент массива.
2017-03-12 17:58:51 +00:00
2017-06-07 01:58:21 +00:00
Если индекс выходит за границы массива, то возвращается некоторое значение по умолчанию (0 для чисел, пустая строка для строк и т. п.).
2017-03-12 17:58:51 +00:00
2017-11-22 06:14:09 +00:00
## has(arr, elem)
2017-03-12 17:58:51 +00:00
Проверяет наличие элемента elem в массиве arr.
Возвращает 0, если элемента в массиве нет, или 1, если есть.
2017-11-22 06:14:09 +00:00
## indexOf(arr, x)
2017-03-12 17:58:51 +00:00
Возвращает индекс элемента x (начиная с 1), если он есть в массиве, или 0, если е г о нет.
2017-11-22 06:14:09 +00:00
## countEqual(arr, x)
2017-10-25 05:27:09 +00:00
Возвращает количество элементов массива, равных x. Эквивалентно arrayCount(elem -> elem = x, arr).
2017-03-12 17:58:51 +00:00
2017-11-22 06:14:09 +00:00
## arrayEnumerate(arr)
2017-10-25 05:27:09 +00:00
Возвращает массив \[1, 2, 3, ..., length(arr)\]
2017-03-12 17:58:51 +00:00
Эта функция обычно используется совместно с ARRAY JOIN. Она позволяет, после применения ARRAY JOIN, посчитать что-либо только один раз для каждого массива. Пример:
2017-10-25 05:27:09 +00:00
```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 │
└─────────┴───────┘
```
2017-03-12 17:58:51 +00:00
В этом примере, Reaches - число достижений целей (строк, получившихся после применения ARRAY JOIN), а Hits - число хитов (строк, которые были до ARRAY JOIN). В данном случае, тот же результат можно получить проще:
2017-10-25 05:27:09 +00:00
```sql
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
2017-10-25 05:27:09 +00:00
```text
┌─Reaches─┬──Hits─┐
│ 95606 │ 31406 │
└─────────┴───────┘
```
2017-03-12 17:58:51 +00:00
Также эта функция может быть использована в функциях высшего порядка. Например, с её помощью можно достать индексы массива для элементов, удовлетворяющих некоторому условию.
2017-11-22 06:14:09 +00:00
## arrayEnumerateUniq(arr, ...)
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
Пример:
2017-10-25 05:27:09 +00:00
```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 │
└─────────┴─────────┴────────┘
```
2017-03-12 17:58:51 +00:00
В этом примере, для каждого идентификатора цели, посчитано количество достижений целей (каждый элемент вложенной структуры данных Goals является достижением целей) и количество визитов. Если бы не было ARRAY JOIN, мы бы считали количество визитов как sum(Sign). Н о в данном случае, строчки были размножены по вложенной структуре Goals, и чтобы после этого учесть каждый визит один раз, мы поставили условие на значение функции arrayEnumerateUniq(Goals.ID).
Функция arrayEnumerateUniq может принимать несколько аргументов - массивов одинаковых размеров. В этом случае, уникальность считается для кортежей элементов на одинаковых позициях всех массивов.
2017-10-25 05:27:09 +00:00
```sql
SELECT arrayEnumerateUniq([1, 1, 1, 2, 2, 2], [1, 1, 2, 1, 1, 2]) AS res
```
2017-06-13 04:15:47 +00:00
2017-10-25 05:27:09 +00:00
```text
┌─res───────────┐
│ [1,2,1,1,2,1] │
└───────────────┘
```
2017-03-12 17:58:51 +00:00
Это нужно при использовании ARRAY JOIN с вложенной структурой данных и затем агрегации по нескольким элементам этой структуры.
2017-11-22 06:14:09 +00:00
## 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` - Одиночное значение того же типа, что хранится в массиве.
**Пример**
```sql
SELECT arrayPushBack(['a'], 'b') AS res
```
```
┌─res───────┐
│ ['a','b'] │
└───────────┘
```
## arrayPushFront
Добавляет один элемент в начало массива.
```
arrayPushFront(array, single_value)
```
**Аргументы**
- `array` - Массив.
- `single_value` - Одиночное значение того же типа, что хранится в массиве.
**Пример**
```sql
SELECT arrayPushBack(['b'], 'a') AS res
```
```
┌─res───────┐
│ ['a','b'] │
└───────────┘
```
## arraySlice
Возвращает срез массива.
```
arraySlice(array, offset, length)
```
**Аргументы**
- `array` - Массив данных.
- `offset` - Отступ от начала массива. Отсчет начинается с 1.
- `length` - Длина необходимого среза.
**Пример**
```sql
SELECT arraySlice([1, 2, 3, 4, 5], 2, 3) AS res
```
```
┌─res─────┐
│ [2,3,4] │
└─────────┘
```
## arrayUniq(arr, ...)
2017-03-12 17:58:51 +00:00
Если передан один аргумент, считает количество разных элементов в массиве.
Если передано несколько аргументов, считает количество разных кортежей из элементов на соответствующих позициях в нескольких массивах.
Если необходимо получить список уникальных элементов массива, можно воспользоваться arrayReduce('groupUniqArray', arr).
2017-11-22 06:14:09 +00:00
## arrayJoin(arr)
Особенная функция. Смотрите раздел ["Функция arrayJoin" ](array_join.md#functions_arrayjoin ).