ClickHouse/docs/ru/sql-reference/functions/tuple-functions.md
2024-05-23 13:54:45 +02:00

31 KiB
Raw Blame History

slug sidebar_position sidebar_label
/ru/sql-reference/functions/tuple-functions 68 Функции для работы с кортежами

Функции для работы с кортежами

tuple

Функция, позволяющая сгруппировать несколько столбцов. Для столбцов, имеющих типы T1, T2, ... возвращает кортеж типа Tuple(T1, T2, ...), содержащий эти столбцы. Выполнение функции ничего не стоит. Кортежи обычно используются как промежуточное значение в качестве аргумента операторов IN, или для создания списка формальных параметров лямбда-функций. Кортежи не могут быть записаны в таблицу.

С помощью функции реализуется оператор (x, y, ...).

Синтаксис

tuple(x, y, ...)

tupleElement

Функция, позволяющая достать столбец из кортежа. N - индекс столбца начиная с 1. N должно быть константой. N должно быть целым строго положительным числом не большим размера кортежа. Выполнение функции ничего не стоит.

С помощью функции реализуется оператор x.N.

Синтаксис

tupleElement(tuple, n)

untuple

Выполняет синтаксическую подстановку элементов кортежа в место вызова.

Синтаксис

untuple(x)

Чтобы пропустить некоторые столбцы в результате запроса, вы можете использовать выражение EXCEPT.

Аргументы

  • x — функция tuple, столбец или кортеж элементов. Tuple.

Возвращаемое значение

  • Нет.

Примеры

Входная таблица:

┌─key─┬─v1─┬─v2─┬─v3─┬─v4─┬─v5─┬─v6────────┐
│   1 │ 10 │ 20 │ 40 │ 30 │ 15 │ (33,'ab') │
│   2 │ 25 │ 65 │ 70 │ 40 │  6 │ (44,'cd') │
│   3 │ 57 │ 30 │ 20 │ 10 │  5 │ (55,'ef') │
│   4 │ 55 │ 12 │  7 │ 80 │ 90 │ (66,'gh') │
│   5 │ 30 │ 50 │ 70 │ 25 │ 55 │ (77,'kl') │
└─────┴────┴────┴────┴────┴────┴───────────┘

Пример использования столбца типа Tuple в качестве параметра функции untuple:

Запрос:

SELECT untuple(v6) FROM kv;

Результат:

┌─_ut_1─┬─_ut_2─┐
│    33 │ ab    │
│    44 │ cd    │
│    55 │ ef    │
│    66 │ gh    │
│    77 │ kl    │
└───────┴───────┘

Пример использования выражения EXCEPT:

Запрос:

SELECT untuple((* EXCEPT (v2, v3),)) FROM kv;

Результат:

┌─key─┬─v1─┬─v4─┬─v5─┬─v6────────┐
│   1 │ 10 │ 30 │ 15 │ (33,'ab') │
│   2 │ 25 │ 40 │  6 │ (44,'cd') │
│   3 │ 57 │ 10 │  5 │ (55,'ef') │
│   4 │ 55 │ 80 │ 90 │ (66,'gh') │
│   5 │ 30 │ 25 │ 55 │ (77,'kl') │
└─────┴────┴────┴────┴───────────┘

Смотрите также

tupleHammingDistance

Возвращает расстояние Хэмминга между двумя кортежами одинакового размера.

Синтаксис

tupleHammingDistance(tuple1, tuple2)

Аргументы

  • tuple1 — первый кортеж. Tuple.
  • tuple2 — второй кортеж. Tuple.

Кортежи должны иметь одинаковый размер и тип элементов.

Возвращаемое значение

  • Расстояние Хэмминга.

Тип: UInt8.

Примеры

Запрос:

SELECT tupleHammingDistance((1, 2, 3), (3, 2, 1)) AS HammingDistance;

Результат:

┌─HammingDistance─┐
│               2 │
└─────────────────┘

Может быть использовано с функциями MinHash для проверки строк на совпадение:

SELECT tupleHammingDistance(wordShingleMinHash(string), wordShingleMinHashCaseInsensitive(string)) as HammingDistance FROM (SELECT 'Clickhouse is a column-oriented database management system for online analytical processing of queries.' AS string);

Результат:

┌─HammingDistance─┐
│               2 │
└─────────────────┘

tupleToNameValuePairs

Приводит именованный кортеж к списку пар (имя, значение). Для Tuple(a T, b T, ..., c T) возвращает Array(Tuple(String, T), ...), где Strings — это названия именованных полей, а T — это соответствующие значения. Все значения в кортеже должны быть одинакового типа.

Синтаксис

tupleToNameValuePairs(tuple)

Аргументы

  • tuple — именованный кортеж. Tuple с любым типом значений.

Возвращаемое значение

  • Список пар (имя, значение).

Тип: Array(Tuple(String, ...)).

Пример

Запрос:

CREATE TABLE tupletest (`col` Tuple(user_ID UInt64, session_ID UInt64) ENGINE = Memory;

INSERT INTO tupletest VALUES (tuple( 100, 2502)), (tuple(1,100));

SELECT tupleToNameValuePairs(col) FROM tupletest;

Результат:

┌─tupleToNameValuePairs(col)────────────┐
│ [('user_ID',100),('session_ID',2502)] │
│ [('user_ID',1),('session_ID',100)]    │
└───────────────────────────────────────┘

С помощью этой функции можно выводить столбцы в виде строк:

CREATE TABLE tupletest (`col` Tuple(CPU Float64, Memory Float64, Disk Float64)) ENGINE = Memory;

INSERT INTO tupletest VALUES(tuple(3.3, 5.5, 6.6));

SELECT arrayJoin(tupleToNameValuePairs(col))FROM tupletest;

Результат:

┌─arrayJoin(tupleToNameValuePairs(col))─┐
│ ('CPU',3.3)                           │
│ ('Memory',5.5)                        │
│ ('Disk',6.6)                          │
└───────────────────────────────────────┘

Если в функцию передается обычный кортеж, ClickHouse использует индексы значений в качестве имен:

SELECT tupleToNameValuePairs(tuple(3, 2, 1));

Результат:

┌─tupleToNameValuePairs(tuple(3, 2, 1))─┐
│ [('1',3),('2',2),('3',1)]             │
└───────────────────────────────────────┘

tuplePlus

Вычисляет сумму соответствующих значений двух кортежей одинакового размера.

Синтаксис

tuplePlus(tuple1, tuple2)

Синоним: vectorSum.

Аргументы

  • tuple1 — первый кортеж. Tuple.
  • tuple2 — второй кортеж. Tuple.

Возвращаемое значение

  • Кортеж с суммами.

Тип: Tuple.

Пример

Запрос:

SELECT tuplePlus((1, 2), (2, 3));

Результат:

┌─tuplePlus((1, 2), (2, 3))─┐
│ (3,5)                     │
└───────────────────────────┘

tupleMinus

Вычисляет разность соответствующих значений двух кортежей одинакового размера.

Синтаксис

tupleMinus(tuple1, tuple2)

Синоним: vectorDifference.

Аргументы

  • tuple1 — первый кортеж. Tuple.
  • tuple2 — второй кортеж. Tuple.

Возвращаемое значение

  • Кортеж с разностями.

Тип: Tuple.

Пример

Запрос:

SELECT tupleMinus((1, 2), (2, 3));

Результат:

┌─tupleMinus((1, 2), (2, 3))─┐
│ (-1,-1)                    │
└────────────────────────────┘

tupleMultiply

Вычисляет произведение соответствующих значений двух кортежей одинакового размера.

Синтаксис

tupleMultiply(tuple1, tuple2)

Аргументы

  • tuple1 — первый кортеж. Tuple.
  • tuple2 — второй кортеж. Tuple.

Возвращаемое значение

  • Кортеж с произведениями.

Тип: Tuple.

Пример

Запрос:

SELECT tupleMultiply((1, 2), (2, 3));

Результат:

┌─tupleMultiply((1, 2), (2, 3))─┐
│ (2,6)                         │
└───────────────────────────────┘

tupleDivide

Вычисляет частное соответствующих значений двух кортежей одинакового размера. Обратите внимание, что при делении на ноль возвращается значение inf.

Синтаксис

tupleDivide(tuple1, tuple2)

Аргументы

  • tuple1 — первый кортеж. Tuple.
  • tuple2 — второй кортеж. Tuple.

Возвращаемое значение

  • Кортеж с частными.

Тип: Tuple.

Пример

Запрос:

SELECT tupleDivide((1, 2), (2, 3));

Результат:

┌─tupleDivide((1, 2), (2, 3))─┐
│ (0.5,0.6666666666666666)    │
└─────────────────────────────┘

tupleNegate

Применяет отрицание ко всем значениям кортежа.

Синтаксис

tupleNegate(tuple)

Аргументы

  • tuple — кортеж. Tuple.

Возвращаемое значение

  • Кортеж с результатом отрицания.

Тип: Tuple.

Пример

Запрос:

SELECT tupleNegate((1, 2));

Результат:

┌─tupleNegate((1, 2))─┐
│ (-1,-2)             │
└─────────────────────┘

tupleMultiplyByNumber

Возвращает кортеж, в котором значения всех элементов умножены на заданное число.

Синтаксис

tupleMultiplyByNumber(tuple, number)

Аргументы

Возвращаемое значение

  • Кортеж с результатами умножения на число.

Тип: Tuple.

Пример

Запрос:

SELECT tupleMultiplyByNumber((1, 2), -2.1);

Результат:

┌─tupleMultiplyByNumber((1, 2), -2.1)─┐
│ (-2.1,-4.2)                         │
└─────────────────────────────────────┘

tupleDivideByNumber

Возвращает кортеж, в котором значения всех элементов поделены на заданное число. Обратите внимание, что при делении на ноль возвращается значение inf.

Синтаксис

tupleDivideByNumber(tuple, number)

Аргументы

Возвращаемое значение

  • Кортеж с результатами деления на число.

Тип: Tuple.

Пример

Запрос:

SELECT tupleDivideByNumber((1, 2), 0.5);

Результат:

┌─tupleDivideByNumber((1, 2), 0.5)─┐
│ (2,4)                            │
└──────────────────────────────────┘

dotProduct

Вычисляет скалярное произведение двух кортежей одинакового размера.

Синтаксис

dotProduct(tuple1, tuple2)

Синоним: scalarProduct.

Аргументы

  • tuple1 — первый кортеж. Tuple.
  • tuple2 — второй кортеж. Tuple.

Возвращаемое значение

  • Скалярное произведение.

Тип: Int/UInt, Float или Decimal.

Пример

Запрос:

SELECT dotProduct((1, 2), (2, 3));

Результат:

┌─dotProduct((1, 2), (2, 3))─┐
│                          8 │
└────────────────────────────┘

L1Norm

Вычисляет сумму абсолютных значений кортежа.

Синтаксис

L1Norm(tuple)

Синоним: normL1.

Аргументы

  • tuple — кортеж. Tuple.

Возвращаемое значение

Тип: UInt, Float или Decimal.

Пример

Запрос:

SELECT L1Norm((1, 2));

Результат:

┌─L1Norm((1, 2))─┐
│              3 │
└────────────────┘

L2Norm

Вычисляет квадратный корень из суммы квадратов значений кортежа.

Синтаксис

L2Norm(tuple)

Синоним: normL2.

Аргументы

  • tuple — кортеж. Tuple.

Возвращаемое значение

Тип: Float.

Пример

Запрос:

SELECT L2Norm((1, 2));

Результат:

┌───L2Norm((1, 2))─┐
│ 2.23606797749979 │
└──────────────────┘

LinfNorm

Вычисляет максимум из абсолютных значений кортежа.

Синтаксис

LinfNorm(tuple)

Синоним: normLinf.

Аргументы

  • tuple — кортеж. Tuple.

Возвращаемое значение

  • Linf-норма или максимальное абсолютное значение.

Тип: Float.

Пример

Запрос:

SELECT LinfNorm((1, -2));

Результат:

┌─LinfNorm((1, -2))─┐
│                 2 │
└───────────────────┘

LpNorm

Возвращает корень степени p из суммы абсолютных значений кортежа, возведенных в степень p.

Синтаксис

LpNorm(tuple, p)

Синоним: normLp.

Аргументы

  • tuple — кортеж. Tuple.
  • p — степень. Возможные значение: любое число из промежутка [1;inf). UInt или Float.

Возвращаемое значение

Тип: Float.

Пример

Запрос:

SELECT LpNorm((1, -2),2);

Результат:

┌─LpNorm((1, -2), 2)─┐
│   2.23606797749979 │
└────────────────────┘

L1Distance

Вычисляет расстояние между двумя точками (значения кортежей — координаты точек) в пространстве L1 (расстояние городских кварталов).

Синтаксис

L1Distance(tuple1, tuple2)

Синоним: distanceL1.

Аргументы

  • tuple1 — первый кортеж. Tuple.
  • tuple2 — второй кортеж. Tuple.

Возвращаемое значение

  • Расстояние в норме L1.

Тип: Float.

Пример

Запрос:

SELECT L1Distance((1, 2), (2, 3));

Результат:

┌─L1Distance((1, 2), (2, 3))─┐
│                          2 │
└────────────────────────────┘

L2Distance

Вычисляет расстояние между двумя точками (значения кортежей — координаты точек) в пространстве L2 (Евклидово расстояние).

Синтаксис

L2Distance(tuple1, tuple2)

Синоним: distanceL2.

Аргументы

  • tuple1 — первый кортеж. Tuple.
  • tuple2 — второй кортеж. Tuple.

Возвращаемое значение

  • Расстояние в норме L2.

Тип: Float.

Пример

Запрос:

SELECT L2Distance((1, 2), (2, 3));

Результат:

┌─L2Distance((1, 2), (2, 3))─┐
│         1.4142135623730951 │
└────────────────────────────┘

LinfDistance

Вычисляет расстояние между двумя точками (значения кортежей — координаты точек) в пространстве L_{inf}.

Синтаксис

LinfDistance(tuple1, tuple2)

Синоним: distanceLinf.

Аргументы

  • tuple1 — первый кортеж. Tuple.
  • tuple2 — второй кортеж. Tuple.

Возвращаемые значения

  • Расстояние в норме Linf.

Тип: Float.

Пример

Запрос:

SELECT LinfDistance((1, 2), (2, 3));

Результат:

┌─LinfDistance((1, 2), (2, 3))─┐
│                            1 │
└──────────────────────────────┘

LpDistance

Вычисляет расстояние между двумя точками (значения кортежей — координаты точек) в пространстве Lp.

Синтаксис

LpDistance(tuple1, tuple2, p)

Синоним: distanceLp.

Аргументы

  • tuple1 — первый кортеж. Tuple.
  • tuple2 — второй кортеж. Tuple.
  • p — степень. Возможные значение: любое число из промежутка [1;inf). UInt или Float.

Возвращаемое значение

  • Расстояние в норме Lp.

Тип: Float.

Пример

Запрос:

SELECT LpDistance((1, 2), (2, 3), 3);

Результат:

┌─LpDistance((1, 2), (2, 3), 3)─┐
│            1.2599210498948732 │
└───────────────────────────────┘

L1Normalize

Вычисляет единичный вектор для исходного вектора (значения кортежа — координаты вектора) в пространстве L1 (расстояние городских кварталов).

Синтаксис

L1Normalize(tuple)

Синоним: normalizeL1.

Аргументы

Возвращаемое значение

  • Единичный вектор.

Тип: кортеж Tuple значений Float.

Пример

Запрос:

SELECT L1Normalize((1, 2));

Результат:

┌─L1Normalize((1, 2))─────────────────────┐
│ (0.3333333333333333,0.6666666666666666) │
└─────────────────────────────────────────┘

L2Normalize

Вычисляет единичный вектор для исходного вектора (значения кортежа — координаты вектора) в пространстве L2 (Евклидово пространство.

Синтаксис

L2Normalize(tuple)

Синоним: normalizeL1.

Аргументы

  • tuple — кортеж. Tuple.

Возвращаемое значение

  • Единичный вектор.

Тип: кортеж Tuple значений Float.

Пример

Запрос:

SELECT L2Normalize((3, 4));

Результат:

┌─L2Normalize((3, 4))─┐
│ (0.6,0.8)           │
└─────────────────────┘

LinfNormalize

Вычисляет единичный вектор для исходного вектора (значения кортежа — координаты вектора) в пространстве L_{inf}.

Синтаксис

LinfNormalize(tuple)

Синоним: normalizeLinf .

Аргументы

  • tuple — кортеж. Tuple.

Возвращаемое значение

  • Единичный вектор.

Тип: кортеж Tuple значений Float.

Пример

Запрос:

SELECT LinfNormalize((3, 4));

Результат:

┌─LinfNormalize((3, 4))─┐
│ (0.75,1)              │
└───────────────────────┘

LpNormalize

Вычисляет единичный вектор для исходного вектора (значения кортежа — координаты вектора) в пространстве Lp.

Синтаксис

LpNormalize(tuple, p)

Синоним: normalizeLp .

Аргументы

  • tuple — кортеж. Tuple.
  • p — степень. Возможные значение: любое число из промежутка [1;inf). UInt или Float.

Возвращаемое значение

  • Единичный вектор.

Тип: кортеж Tuple значений Float.

Пример

Запрос:

SELECT LpNormalize((3, 4),5);

Результат:

┌─LpNormalize((3, 4), 5)──────────────────┐
│ (0.7187302630182624,0.9583070173576831) │
└─────────────────────────────────────────┘

cosineDistance

Вычисляет косинусную разницу двух векторов (значения кортежей — координаты векторов). Чем меньше возвращаемое значение, тем больше сходство между векторами.

Синтаксис

cosineDistance(tuple1, tuple2)

Аргументы

  • tuple1 — первый кортеж. Tuple.
  • tuple2 — второй кортеж. Tuple.

Возвращаемые значения

  • Разность между единицей и косинуса угла между векторами.

Тип: Float.

Пример

Запрос:

SELECT cosineDistance((1, 2), (2, 3));

Результат:

┌─cosineDistance((1, 2), (2, 3))─┐
│           0.007722123286332261 │
└────────────────────────────────┘