77 KiB
toc_priority | toc_title |
---|---|
66 | Прочие функции |
Прочие функции
hostName()
Возвращает строку - имя хоста, на котором эта функция была выполнена. При распределённой обработке запроса, это будет имя хоста удалённого сервера, если функция выполняется на удалённом сервере.
getMacro
Возвращает именованное значение из секции macros конфигурации сервера.
Синтаксис
getMacro(name)
Аргументы
name
— имя, которое необходимо получить из секцииmacros
. String.
Возвращаемое значение
- Значение по указанному имени.
Тип: String.
Пример
Пример секции macros
в конфигурационном файле сервера:
<macros>
<test>Value</test>
</macros>
Запрос:
SELECT getMacro('test');
Результат:
┌─getMacro('test')─┐
│ Value │
└──────────────────┘
Альтернативный способ получения значения:
SELECT * FROM system.macros
WHERE macro = 'test'
┌─macro─┬─substitution─┐
│ test │ Value │
└───────┴──────────────┘
FQDN
Возвращает полное имя домена.
Синтаксис
fqdn()
Эта функция регистронезависимая.
Возвращаемое значение
- Полное имя домена.
Тип: String
.
Пример
Запрос:
SELECT FQDN();
Результат:
┌─FQDN()──────────────────────────┐
│ clickhouse.ru-central1.internal │
└─────────────────────────────────┘
basename
Извлекает конечную часть строки после последнего слэша или бэкслэша. Функция часто используется для извлечения имени файла из пути.
basename( expr )
Аргументы
expr
— выражение, возвращающее значение типа String. В результирующем значении все бэкслэши должны быть экранированы.
Возвращаемое значение
Строка, содержащая:
-
Конечную часть строки после последнего слэша или бэкслэша.
Если входная строка содержит путь, заканчивающийся слэшем или бэкслэшем, например, `/` или `с:\`, функция возвращает пустую строку.
-
Исходная строка, если нет слэша или бэкслэша.
Пример
SELECT 'some/long/path/to/file' AS a, basename(a);
┌─a──────────────────────┬─basename('some\\long\\path\\to\\file')─┐
│ some\long\path\to\file │ file │
└────────────────────────┴────────────────────────────────────────┘
SELECT 'some\\long\\path\\to\\file' AS a, basename(a);
┌─a──────────────────────┬─basename('some\\long\\path\\to\\file')─┐
│ some\long\path\to\file │ file │
└────────────────────────┴────────────────────────────────────────┘
SELECT 'some-file-name' AS a, basename(a);
┌─a──────────────┬─basename('some-file-name')─┐
│ some-file-name │ some-file-name │
└────────────────┴────────────────────────────┘
visibleWidth(x)
Вычисляет приблизительную ширину при выводе значения в текстовом (tab-separated) виде на консоль. Функция используется системой для реализации Pretty форматов.
NULL
представляется как строка, соответствующая отображению NULL
в форматах Pretty
.
SELECT visibleWidth(NULL)
┌─visibleWidth(NULL)─┐
│ 4 │
└────────────────────┘
toTypeName(x)
Возвращает строку, содержащую имя типа переданного аргумента.
Если на вход функции передать NULL
, то она вернёт тип Nullable(Nothing)
, что соответствует внутреннему представлению NULL
в ClickHouse.
blockSize()
Получить размер блока. В ClickHouse выполнение запроса всегда идёт по блокам (наборам кусочков столбцов). Функция позволяет получить размер блока, для которого её вызвали.
byteSize
Возвращает оценку в байтах размера аргументов в памяти в несжатом виде.
Синтаксис
byteSize(argument [, ...])
Аргументы
argument
— значение.
Возвращаемое значение
- Оценка размера аргументов в памяти в байтах.
Тип: UInt64.
Примеры
Для аргументов типа String функция возвращает длину строки + 9 (нуль-терминатор + длина)
Запрос:
SELECT byteSize('string');
Результат:
┌─byteSize('string')─┐
│ 15 │
└────────────────────┘
Запрос:
CREATE TABLE test
(
`key` Int32,
`u8` UInt8,
`u16` UInt16,
`u32` UInt32,
`u64` UInt64,
`i8` Int8,
`i16` Int16,
`i32` Int32,
`i64` Int64,
`f32` Float32,
`f64` Float64
)
ENGINE = MergeTree
ORDER BY key;
INSERT INTO test VALUES(1, 8, 16, 32, 64, -8, -16, -32, -64, 32.32, 64.64);
SELECT key, byteSize(u8) AS `byteSize(UInt8)`, byteSize(u16) AS `byteSize(UInt16)`, byteSize(u32) AS `byteSize(UInt32)`, byteSize(u64) AS `byteSize(UInt64)`, byteSize(i8) AS `byteSize(Int8)`, byteSize(i16) AS `byteSize(Int16)`, byteSize(i32) AS `byteSize(Int32)`, byteSize(i64) AS `byteSize(Int64)`, byteSize(f32) AS `byteSize(Float32)`, byteSize(f64) AS `byteSize(Float64)` FROM test ORDER BY key ASC FORMAT Vertical;
Результат:
Row 1:
──────
key: 1
byteSize(UInt8): 1
byteSize(UInt16): 2
byteSize(UInt32): 4
byteSize(UInt64): 8
byteSize(Int8): 1
byteSize(Int16): 2
byteSize(Int32): 4
byteSize(Int64): 8
byteSize(Float32): 4
byteSize(Float64): 8
Если функция принимает несколько аргументов, то она возвращает их совокупный размер в байтах.
Запрос:
SELECT byteSize(NULL, 1, 0.3, '');
Результат:
┌─byteSize(NULL, 1, 0.3, '')─┐
│ 19 │
└────────────────────────────┘
materialize(x)
Превращает константу в полноценный столбец, содержащий только одно значение. В ClickHouse полноценные столбцы и константы представлены в памяти по-разному. Функции по-разному работают для аргументов-констант и обычных аргументов (выполняется разный код), хотя результат почти всегда должен быть одинаковым. Эта функция предназначена для отладки такого поведения.
ignore(…)
Принимает любые аргументы, в т.ч. NULL
, всегда возвращает 0.
При этом, аргумент всё равно вычисляется. Это может использоваться для бенчмарков.
sleep(seconds)
Спит seconds секунд на каждый блок данных. Можно указать как целое число, так и число с плавающей запятой.
currentDatabase()
Возвращает имя текущей базы данных. Эта функция может использоваться в параметрах движка таблицы в запросе CREATE TABLE там, где нужно указать базу данных.
currentUser()
Возвращает логин текущего пользователя. При распределенном запросе, возвращается имя пользователя, инициировавшего запрос.
SELECT currentUser();
Алиас: user()
, USER()
.
Возвращаемые значения
- Логин текущего пользователя.
- При распределенном запросе — логин пользователя, инициировавшего запрос.
Тип: String
.
Пример
Запрос:
SELECT currentUser();
Результат:
┌─currentUser()─┐
│ default │
└───────────────┘
isConstant
Проверяет, является ли аргумент константным выражением.
Константное выражение — это выражение, результат которого известен на момент анализа запроса (до его выполнения). Например, выражения над литералами являются константными.
Используется в целях разработки, отладки или демонстрирования.
Синтаксис
isConstant(x)
Аргументы
x
— выражение для проверки.
Возвращаемые значения
1
— выражениеx
является константным.0
— выражениеx
не является константным.
Тип: UInt8.
Примеры
Запрос:
SELECT isConstant(x + 1) FROM (SELECT 43 AS x);
Результат:
┌─isConstant(plus(x, 1))─┐
│ 1 │
└────────────────────────┘
Запрос:
WITH 3.14 AS pi SELECT isConstant(cos(pi));
Результат:
┌─isConstant(cos(pi))─┐
│ 1 │
└─────────────────────┘
Запрос:
SELECT isConstant(number) FROM numbers(1)
Результат:
┌─isConstant(number)─┐
│ 0 │
└────────────────────┘
isFinite(x)
Принимает Float32 или Float64 и возвращает UInt8, равный 1, если аргумент не бесконечный и не NaN, иначе 0.
ifNotFinite
Проверяет, является ли значение дробного числа с плавающей точкой конечным.
Синтаксис
ifNotFinite(x,y)
Аргументы
x
— значение, которое нужно проверить на бесконечность. Тип: Float*.y
— запасное значение. Тип: Float*.
Возвращаемые значения
x
, еслиx
принимает конечное значение.y
, еслиx
принимает не конечное значение.
Пример
Запрос:
SELECT 1/0 as infimum, ifNotFinite(infimum,42)
Результат:
┌─infimum─┬─ifNotFinite(divide(1, 0), 42)─┐
│ inf │ 42 │
└─────────┴───────────────────────────────┘
Аналогичный результат можно получить с помощью тернарного оператора isFinite(x) ? x : y
.
isInfinite(x)
Принимает Float32 или Float64 и возвращает UInt8, равный 1, если аргумент бесконечный, иначе 0. Отметим, что в случае NaN возвращается 0.
isNaN(x)
Принимает Float32 или Float64 и возвращает UInt8, равный 1, если аргумент является NaN, иначе 0.
hasColumnInTable([‘hostname’[, ‘username’[, ‘password’]],] ‘database’, ‘table’, ‘column’)
Принимает константные строки - имя базы данных, имя таблицы и название столбца. Возвращает константное выражение типа UInt8, равное 1, если есть столбец, иначе 0. Если задан параметр hostname, проверка будет выполнена на удалённом сервере. Функция кидает исключение, если таблица не существует. Для элементов вложенной структуры данных функция проверяет существование столбца. Для самой же вложенной структуры данных функция возвращает 0.
bar
Позволяет построить unicode-art диаграмму.
bar(x, min, max, width)
рисует полосу ширины пропорциональной (x - min)
и равной width
символов при x = max
.
Аргументы:
x
— Величина для отображения.min, max
— Целочисленные константы, значение должно помещаться вInt64
.width
— Константа, положительное число, может быть дробным.
Полоса рисуется с точностью до одной восьмой символа.
Пример:
SELECT
toHour(EventTime) AS h,
count() AS c,
bar(c, 0, 600000, 20) AS bar
FROM test.hits
GROUP BY h
ORDER BY h ASC
┌──h─┬──────c─┬─bar────────────────┐
│ 0 │ 292907 │ █████████▋ │
│ 1 │ 180563 │ ██████ │
│ 2 │ 114861 │ ███▋ │
│ 3 │ 85069 │ ██▋ │
│ 4 │ 68543 │ ██▎ │
│ 5 │ 78116 │ ██▌ │
│ 6 │ 113474 │ ███▋ │
│ 7 │ 170678 │ █████▋ │
│ 8 │ 278380 │ █████████▎ │
│ 9 │ 391053 │ █████████████ │
│ 10 │ 457681 │ ███████████████▎ │
│ 11 │ 493667 │ ████████████████▍ │
│ 12 │ 509641 │ ████████████████▊ │
│ 13 │ 522947 │ █████████████████▍ │
│ 14 │ 539954 │ █████████████████▊ │
│ 15 │ 528460 │ █████████████████▌ │
│ 16 │ 539201 │ █████████████████▊ │
│ 17 │ 523539 │ █████████████████▍ │
│ 18 │ 506467 │ ████████████████▊ │
│ 19 │ 520915 │ █████████████████▎ │
│ 20 │ 521665 │ █████████████████▍ │
│ 21 │ 542078 │ ██████████████████ │
│ 22 │ 493642 │ ████████████████▍ │
│ 23 │ 400397 │ █████████████▎ │
└────┴────────┴────────────────────┘
transform
Преобразовать значение согласно явно указанному отображению одних элементов на другие. Имеется два варианта функции:
transform(x, array_from, array_to, default)
x
- что преобразовывать.
array_from
- константный массив значений для преобразования.
array_to
- константный массив значений, в которые должны быть преобразованы значения из from.
default
- какое значение использовать, если x не равен ни одному из значений во from.
array_from
и array_to
- массивы одинаковых размеров.
Типы:
transform(T, Array(T), Array(U), U) -> U
T
и U
- могут быть числовыми, строковыми, или Date или DateTime типами.
При этом, где обозначена одна и та же буква (T или U), могут быть, в случае числовых типов, не совпадающие типы, а типы, для которых есть общий тип.
Например, первый аргумент может иметь тип Int64, а второй - Array(UInt16).
Если значение x равно одному из элементов массива array_from, то возвращает соответствующий (такой же по номеру) элемент массива array_to; иначе возвращает default. Если имеется несколько совпадающих элементов в array_from, то возвращает какой-нибудь из соответствующих.
Пример:
SELECT
transform(SearchEngineID, [2, 3], ['Yandex', 'Google'], 'Other') AS title,
count() AS c
FROM test.hits
WHERE SearchEngineID != 0
GROUP BY title
ORDER BY c DESC
┌─title─────┬──────c─┐
│ Yandex │ 498635 │
│ Google │ 229872 │
│ Other │ 104472 │
└───────────┴────────┘
transform(x, array_from, array_to)
Отличается от первого варианта отсутствующим аргументом default. Если значение x равно одному из элементов массива array_from, то возвращает соответствующий (такой же по номеру) элемент массива array_to; иначе возвращает x.
Типы:
transform(T, Array(T), Array(T)) -> T
Пример:
SELECT
transform(domain(Referer), ['yandex.ru', 'google.ru', 'vk.com'], ['www.yandex', 'example.com']) AS s,
count() AS c
FROM test.hits
GROUP BY domain(Referer)
ORDER BY count() DESC
LIMIT 10
┌─s──────────────┬───────c─┐
│ │ 2906259 │
│ www.yandex │ 867767 │
│ ███████.ru │ 313599 │
│ mail.yandex.ru │ 107147 │
│ ██████.ru │ 100355 │
│ █████████.ru │ 65040 │
│ news.yandex.ru │ 64515 │
│ ██████.net │ 59141 │
│ example.com │ 57316 │
└────────────────┴─────────┘
formatReadableSize(x)
Принимает размер (число байт). Возвращает округленный размер с суффиксом (KiB, MiB и т.д.) в виде строки.
Пример:
SELECT
arrayJoin([1, 1024, 1024*1024, 192851925]) AS filesize_bytes,
formatReadableSize(filesize_bytes) AS filesize
┌─filesize_bytes─┬─filesize───┐
│ 1 │ 1.00 B │
│ 1024 │ 1.00 KiB │
│ 1048576 │ 1.00 MiB │
│ 192851925 │ 183.92 MiB │
└────────────────┴────────────┘
formatReadableQuantity(x)
Принимает число. Возвращает округленное число с суффиксом (thousand, million, billion и т.д.) в виде строки.
Облегчает визуальное восприятие больших чисел живым человеком.
Пример:
SELECT
arrayJoin([1024, 1234 * 1000, (4567 * 1000) * 1000, 98765432101234]) AS number,
formatReadableQuantity(number) AS number_for_humans
┌─────────number─┬─number_for_humans─┐
│ 1024 │ 1.02 thousand │
│ 1234000 │ 1.23 million │
│ 4567000000 │ 4.57 billion │
│ 98765432101234 │ 98.77 trillion │
└────────────────┴───────────────────┘
least(a, b)
Возвращает наименьшее значение из a и b.
greatest(a, b)
Возвращает наибольшее значение из a и b.
uptime()
Возвращает аптайм сервера в секундах.
version()
Возвращает версию сервера в виде строки.
rowNumberInBlock
Возвращает порядковый номер строки в блоке данных. Для каждого блока данных нумерация начинается с 0.
rowNumberInAllBlocks()
Возвращает порядковый номер строки в блоке данных. Функция учитывает только задействованные блоки данных.
neighbor
Функция позволяет получить доступ к значению в столбце column
, находящемуся на смещении offset
относительно текущей строки. Является частичной реализацией оконных функций LEAD()
и LAG()
.
Синтаксис
neighbor(column, offset[, default_value])
Результат функции зависит от затронутых блоков данных и порядка данных в блоке.
!!! warning "Предупреждение" Функция может получить доступ к значению в столбце соседней строки только внутри обрабатываемого в данный момент блока данных.
Порядок строк, используемый при вычислении функции neighbor
, может отличаться от порядка строк, возвращаемых пользователю.
Чтобы этого не случилось, вы можете сделать подзапрос с ORDER BY и вызвать функцию извне подзапроса.
Аргументы
column
— имя столбца или скалярное выражение.offset
— смещение от текущей строкиcolumn
. Int64.default_value
— опциональный параметр. Значение, которое будет возвращено, если смещение выходит за пределы блока данных.
Возвращаемое значение
- Значение
column
в смещении от текущей строки, если значениеoffset
не выходит за пределы блока. - Значение по умолчанию для
column
, если значениеoffset
выходит за пределы блока данных. Если передан параметрdefault_value
, то значение берется из него.
Тип: зависит от данных в column
или переданного значения по умолчанию в default_value
.
Пример
Запрос:
SELECT number, neighbor(number, 2) FROM system.numbers LIMIT 10;
Результат:
┌─number─┬─neighbor(number, 2)─┐
│ 0 │ 2 │
│ 1 │ 3 │
│ 2 │ 4 │
│ 3 │ 5 │
│ 4 │ 6 │
│ 5 │ 7 │
│ 6 │ 8 │
│ 7 │ 9 │
│ 8 │ 0 │
│ 9 │ 0 │
└────────┴─────────────────────┘
Запрос:
SELECT number, neighbor(number, 2, 999) FROM system.numbers LIMIT 10;
Результат:
┌─number─┬─neighbor(number, 2, 999)─┐
│ 0 │ 2 │
│ 1 │ 3 │
│ 2 │ 4 │
│ 3 │ 5 │
│ 4 │ 6 │
│ 5 │ 7 │
│ 6 │ 8 │
│ 7 │ 9 │
│ 8 │ 999 │
│ 9 │ 999 │
└────────┴──────────────────────────┘
Эта функция может использоваться для оценки year-over-year значение показателя:
Запрос:
WITH toDate('2018-01-01') AS start_date
SELECT
toStartOfMonth(start_date + (number * 32)) AS month,
toInt32(month) % 100 AS money,
neighbor(money, -12) AS prev_year,
round(prev_year / money, 2) AS year_over_year
FROM numbers(16)
Результат:
┌──────month─┬─money─┬─prev_year─┬─year_over_year─┐
│ 2018-01-01 │ 32 │ 0 │ 0 │
│ 2018-02-01 │ 63 │ 0 │ 0 │
│ 2018-03-01 │ 91 │ 0 │ 0 │
│ 2018-04-01 │ 22 │ 0 │ 0 │
│ 2018-05-01 │ 52 │ 0 │ 0 │
│ 2018-06-01 │ 83 │ 0 │ 0 │
│ 2018-07-01 │ 13 │ 0 │ 0 │
│ 2018-08-01 │ 44 │ 0 │ 0 │
│ 2018-09-01 │ 75 │ 0 │ 0 │
│ 2018-10-01 │ 5 │ 0 │ 0 │
│ 2018-11-01 │ 36 │ 0 │ 0 │
│ 2018-12-01 │ 66 │ 0 │ 0 │
│ 2019-01-01 │ 97 │ 32 │ 0.33 │
│ 2019-02-01 │ 28 │ 63 │ 2.25 │
│ 2019-03-01 │ 56 │ 91 │ 1.62 │
│ 2019-04-01 │ 87 │ 22 │ 0.25 │
└────────────┴───────┴───────────┴────────────────┘
runningDifference(x)
Считает разницу между последовательными значениями строк в блоке данных. Возвращает 0 для первой строки и разницу с предыдущей строкой для каждой последующей строки.
!!! warning "Предупреждение" Функция может взять значение предыдущей строки только внутри текущего обработанного блока данных.
Результат функции зависит от затронутых блоков данных и порядка данных в блоке.
Порядок строк, используемый при вычислении функции runningDifference
, может отличаться от порядка строк, возвращаемых пользователю.
Чтобы этого не случилось, вы можете сделать подзапрос с ORDER BY и вызвать функцию извне подзапроса.
Пример:
SELECT
EventID,
EventTime,
runningDifference(EventTime) AS delta
FROM
(
SELECT
EventID,
EventTime
FROM events
WHERE EventDate = '2016-11-24'
ORDER BY EventTime ASC
LIMIT 5
)
┌─EventID─┬───────────EventTime─┬─delta─┐
│ 1106 │ 2016-11-24 00:00:04 │ 0 │
│ 1107 │ 2016-11-24 00:00:05 │ 1 │
│ 1108 │ 2016-11-24 00:00:05 │ 0 │
│ 1109 │ 2016-11-24 00:00:09 │ 4 │
│ 1110 │ 2016-11-24 00:00:10 │ 1 │
└─────────┴─────────────────────┴───────┘
Обратите внимание — размер блока влияет на результат. С каждым новым блоком состояние runningDifference
сбрасывается.
SELECT
number,
runningDifference(number + 1) AS diff
FROM numbers(100000)
WHERE diff != 1
┌─number─┬─diff─┐
│ 0 │ 0 │
└────────┴──────┘
┌─number─┬─diff─┐
│ 65536 │ 0 │
└────────┴──────┘
set max_block_size=100000 -- по умолчанию 65536!
SELECT
number,
runningDifference(number + 1) AS diff
FROM numbers(100000)
WHERE diff != 1
┌─number─┬─diff─┐
│ 0 │ 0 │
└────────┴──────┘
runningDifferenceStartingWithFirstValue
То же, что и runningDifference, но в первой строке возвращается значение первой строки, а не ноль.
runningConcurrency
Подсчитывает количество одновременно идущих событий. У каждого события есть время начала и время окончания. Считается, что время начала включено в событие, а время окончания исключено из него. Столбцы со временем начала и окончания событий должны иметь одинаковый тип данных. Функция подсчитывает количество событий, происходящих одновременно на момент начала каждого из событий в выборке.
!!! warning "Предупреждение" События должны быть отсортированы по возрастанию времени начала. Если это требование нарушено, то функция вызывает исключение. Каждый блок данных обрабатывается независимо. Если события из разных блоков данных накладываются по времени, они не могут быть корректно обработаны.
Синтаксис
runningConcurrency(start, end)
Аргументы
start
— Столбец с временем начала событий. Date, DateTime или DateTime64.end
— Столбец с временем окончания событий. Date, DateTime или DateTime64.
Возвращаемое значение
- Количество одновременно идущих событий на момент начала каждого события.
Тип: UInt32
Пример
Рассмотрим таблицу:
┌──────start─┬────────end─┐
│ 2021-03-03 │ 2021-03-11 │
│ 2021-03-06 │ 2021-03-12 │
│ 2021-03-07 │ 2021-03-08 │
│ 2021-03-11 │ 2021-03-12 │
└────────────┴────────────┘
Запрос:
SELECT start, runningConcurrency(start, end) FROM example_table;
Результат:
┌──────start─┬─runningConcurrency(start, end)─┐
│ 2021-03-03 │ 1 │
│ 2021-03-06 │ 2 │
│ 2021-03-07 │ 3 │
│ 2021-03-11 │ 2 │
└────────────┴────────────────────────────────┘
MACNumToString(num)
Принимает число типа UInt64. Интерпретирует его, как MAC-адрес в big endian. Возвращает строку, содержащую соответствующий MAC-адрес в формате AA:BB:CC:DD:EE:FF (числа в шестнадцатеричной форме через двоеточие).
MACStringToNum(s)
Функция, обратная к MACNumToString. Если MAC адрес в неправильном формате, то возвращает 0.
MACStringToOUI(s)
Принимает MAC адрес в формате AA:BB:CC:DD:EE:FF (числа в шестнадцатеричной форме через двоеточие). Возвращает первые три октета как число в формате UInt64. Если MAC адрес в неправильном формате, то возвращает 0.
getSizeOfEnumType
Возвращает количество полей в Enum.
getSizeOfEnumType(value)
Аргументы
value
— значение типаEnum
.
Возвращаемые значения
- Количество полей входного значения типа
Enum
. - Исключение, если тип не
Enum
.
Пример
SELECT getSizeOfEnumType( CAST('a' AS Enum8('a' = 1, 'b' = 2) ) ) AS x
┌─x─┐
│ 2 │
└───┘
blockSerializedSize
Возвращает размер на диске (без учета сжатия).
blockSerializedSize(value[, value[, ...]])
Аргументы
value
— значение произвольного типа.
Возвращаемые значения
- Количество байтов, которые будут записаны на диск для блока значений (без сжатия).
Пример
Запрос:
SELECT blockSerializedSize(maxState(1)) as x
Ответ:
┌─x─┐
│ 2 │
└───┘
toColumnTypeName
Возвращает имя класса, которым представлен тип данных столбца в оперативной памяти.
toColumnTypeName(value)
Аргументы
value
— значение произвольного типа.
Возвращаемые значения
- Строка с именем класса, который используется для представления типа данных
value
в оперативной памяти.
Пример разницы между toTypeName
и toColumnTypeName
SELECT toTypeName(CAST('2018-01-01 01:02:03' AS DateTime))
┌─toTypeName(CAST('2018-01-01 01:02:03', 'DateTime'))─┐
│ DateTime │
└─────────────────────────────────────────────────────┘
SELECT toColumnTypeName(CAST('2018-01-01 01:02:03' AS DateTime))
┌─toColumnTypeName(CAST('2018-01-01 01:02:03', 'DateTime'))─┐
│ Const(UInt32) │
└───────────────────────────────────────────────────────────┘
В примере видно, что тип данных DateTime
хранится в памяти как Const(UInt32)
.
dumpColumnStructure
Выводит развернутое описание структур данных в оперативной памяти
dumpColumnStructure(value)
Аргументы
value
— значение произвольного типа.
Возвращаемые значения
- Строка с описанием структуры, которая используется для представления типа данных
value
в оперативной памяти.
Пример
SELECT dumpColumnStructure(CAST('2018-01-01 01:02:03', 'DateTime'))
┌─dumpColumnStructure(CAST('2018-01-01 01:02:03', 'DateTime'))─┐
│ DateTime, Const(size = 1, UInt32(size = 1)) │
└──────────────────────────────────────────────────────────────┘
defaultValueOfArgumentType
Выводит значение по умолчанию для типа данных.
Не учитывает значения по умолчанию для столбцов, заданные пользователем.
defaultValueOfArgumentType(expression)
Аргументы
expression
— значение произвольного типа или выражение, результатом которого является значение произвольного типа.
Возвращаемые значения
0
для чисел;- Пустая строка для строк;
ᴺᵁᴸᴸ
для Nullable.
Пример
SELECT defaultValueOfArgumentType( CAST(1 AS Int8) )
┌─defaultValueOfArgumentType(CAST(1, 'Int8'))─┐
│ 0 │
└─────────────────────────────────────────────┘
SELECT defaultValueOfArgumentType( CAST(1 AS Nullable(Int8) ) )
┌─defaultValueOfArgumentType(CAST(1, 'Nullable(Int8)'))─┐
│ ᴺᵁᴸᴸ │
└───────────────────────────────────────────────────────┘
defaultValueOfTypeName
Выводит значение по умолчанию для указанного типа данных.
Не включает значения по умолчанию для настраиваемых столбцов, установленных пользователем.
defaultValueOfTypeName(type)
Аргументы
type
— тип данных.
Возвращаемое значение
0
для чисел;- Пустая строка для строк;
ᴺᵁᴸᴸ
для Nullable.
Пример
SELECT defaultValueOfTypeName('Int8')
┌─defaultValueOfTypeName('Int8')─┐
│ 0 │
└────────────────────────────────┘
SELECT defaultValueOfTypeName('Nullable(Int8)')
┌─defaultValueOfTypeName('Nullable(Int8)')─┐
│ ᴺᵁᴸᴸ │
└──────────────────────────────────────────┘
indexHint
Возвращает все данные из диапазона, в который попадают данные, соответствующие указанному выражению. Переданное выражение не будет вычислено. Выбор диапазона производится по индексу. Индекс в ClickHouse разреженный, при чтении диапазона в ответ попадают «лишние» соседние данные.
Синтаксис
SELECT * FROM table WHERE indexHint(<expression>)
Возвращаемое значение
Возвращает диапазон индекса, в котором выполняется заданное условие.
Тип: Uint8.
Пример
Рассмотрим пример с использованием тестовых данных таблицы ontime.
Исходная таблица:
SELECT count() FROM ontime
┌─count()─┐
│ 4276457 │
└─────────┘
В таблице есть индексы по полям (FlightDate, (Year, FlightDate))
.
Выполним выборку по дате, где индекс не используется.
Запрос:
SELECT FlightDate AS k, count() FROM ontime GROUP BY k ORDER BY k
ClickHouse обработал всю таблицу (Processed 4.28 million rows
).
Результат:
┌──────────k─┬─count()─┐
│ 2017-01-01 │ 13970 │
│ 2017-01-02 │ 15882 │
........................
│ 2017-09-28 │ 16411 │
│ 2017-09-29 │ 16384 │
│ 2017-09-30 │ 12520 │
└────────────┴─────────┘
Для подключения индекса выбираем конкретную дату.
Запрос:
SELECT FlightDate AS k, count() FROM ontime WHERE k = '2017-09-15' GROUP BY k ORDER BY k
При использовании индекса ClickHouse обработал значительно меньшее количество строк (Processed 32.74 thousand rows
).
Результат:
┌──────────k─┬─count()─┐
│ 2017-09-15 │ 16428 │
└────────────┴─────────┘
Передадим в функцию indexHint
выражение k = '2017-09-15'
.
Запрос:
SELECT
FlightDate AS k,
count()
FROM ontime
WHERE indexHint(k = '2017-09-15')
GROUP BY k
ORDER BY k ASC
ClickHouse применил индекс по аналогии с примером выше (Processed 32.74 thousand rows
).
Выражение k = '2017-09-15'
не используется при формировании результата.
Функция indexHint
позволяет увидеть соседние данные.
Результат:
┌──────────k─┬─count()─┐
│ 2017-09-14 │ 7071 │
│ 2017-09-15 │ 16428 │
│ 2017-09-16 │ 1077 │
│ 2017-09-30 │ 8167 │
└────────────┴─────────┘
replicate
Создает массив, заполненный одним значением.
Используется для внутренней реализации arrayJoin.
SELECT replicate(x, arr);
Аргументы
arr
— исходный массив. ClickHouse создаёт новый массив такой же длины как исходный и заполняет его значениемx
.x
— значение, которым будет заполнен результирующий массив.
Возвращаемое значение
Массив, заполненный значением x
.
Тип: Array
.
Пример
Запрос:
SELECT replicate(1, ['a', 'b', 'c']);
Ответ:
┌─replicate(1, ['a', 'b', 'c'])─┐
│ [1,1,1] │
└───────────────────────────────┘
filesystemAvailable
Возвращает объём доступного для записи данных места на файловой системе. Он всегда меньше общего свободного места (filesystemFree), потому что некоторое пространство зарезервировано для нужд операционной системы.
Синтаксис
filesystemAvailable()
Возвращаемое значение
- Объём доступного для записи данных места в байтах.
Тип: UInt64.
Пример
Запрос:
SELECT formatReadableSize(filesystemAvailable()) AS "Available space", toTypeName(filesystemAvailable()) AS "Type";
Ответ:
┌─Available space─┬─Type───┐
│ 30.75 GiB │ UInt64 │
└─────────────────┴────────┘
filesystemFree
Возвращает объём свободного места на файловой системе. Смотрите также filesystemAvailable
.
Синтаксис
filesystemFree()
Возвращаемое значение
- Объем свободного места в байтах.
Тип: UInt64.
Пример
Запрос:
SELECT formatReadableSize(filesystemFree()) AS "Free space", toTypeName(filesystemFree()) AS "Type";
Результат:
┌─Free space─┬─Type───┐
│ 32.39 GiB │ UInt64 │
└────────────┴────────┘
filesystemCapacity
Возвращает информацию о ёмкости файловой системы в байтах. Для оценки должен быть настроен путь к каталогу с данными.
Синтаксис
filesystemCapacity()
Возвращаемое значение
- Информация о ёмкости файловой системы в байтах.
Тип: UInt64.
Пример
Запрос:
SELECT formatReadableSize(filesystemCapacity()) AS "Capacity", toTypeName(filesystemCapacity()) AS "Type"
Результат:
┌─Capacity──┬─Type───┐
│ 39.32 GiB │ UInt64 │
└───────────┴────────┘
initializeAggregation
Вычисляет результат агрегатной функции для каждой строки. Предназначена для инициализации агрегатных функций с комбинатором -State. Может быть полезна для создания состояний агрегатных функций для последующей их вставки в столбцы типа AggregateFunction или использования в качестве значений по-умолчанию.
Синтаксис
initializeAggregation (aggregate_function, arg1, arg2, ..., argN)
Аргументы
aggregate_function
— название агрегатной функции, состояние которой нужно создать. String.arg
— аргументы, которые передаются в агрегатную функцию.
Возвращаемое значение
- В каждой строке результат агрегатной функции, примененной к аргументам из этой строки.
Тип возвращаемого значения такой же, как и у функции, переданной первым аргументом.
Пример
Запрос:
SELECT uniqMerge(state) FROM (SELECT initializeAggregation('uniqState', number % 3) AS state FROM numbers(10000));
Результат:
┌─uniqMerge(state)─┐
│ 3 │
└──────────────────┘
Запрос:
SELECT finalizeAggregation(state), toTypeName(state) FROM (SELECT initializeAggregation('sumState', number % 3) AS state FROM numbers(5));
Результат:
┌─finalizeAggregation(state)─┬─toTypeName(state)─────────────┐
│ 0 │ AggregateFunction(sum, UInt8) │
│ 1 │ AggregateFunction(sum, UInt8) │
│ 2 │ AggregateFunction(sum, UInt8) │
│ 0 │ AggregateFunction(sum, UInt8) │
│ 1 │ AggregateFunction(sum, UInt8) │
└────────────────────────────┴───────────────────────────────┘
Пример с движком таблиц AggregatingMergeTree
и столбцом типа AggregateFunction
:
CREATE TABLE metrics
(
key UInt64,
value AggregateFunction(sum, UInt64) DEFAULT initializeAggregation('sumState', toUInt64(0))
)
ENGINE = AggregatingMergeTree
ORDER BY key
INSERT INTO metrics VALUES (0, initializeAggregation('sumState', toUInt64(42)))
Смотрите также
finalizeAggregation
Принимает состояние агрегатной функции. Возвращает результат агрегирования (или конечное состояние при использовании комбинатора -State).
Синтаксис
finalizeAggregation(state)
Аргументы
state
— состояние агрегатной функции. AggregateFunction.
Возвращаемые значения
- Значения, которые были агрегированы.
Тип: соответствует типу агрегируемых значений.
Примеры
Запрос:
SELECT finalizeAggregation(( SELECT countState(number) FROM numbers(10)));
Результат:
┌─finalizeAggregation(_subquery16)─┐
│ 10 │
└──────────────────────────────────┘
Запрос:
SELECT finalizeAggregation(( SELECT sumState(number) FROM numbers(10)));
Результат:
┌─finalizeAggregation(_subquery20)─┐
│ 45 │
└──────────────────────────────────┘
Обратите внимание, что значения NULL
игнорируются.
Запрос:
SELECT finalizeAggregation(arrayReduce('anyState', [NULL, 2, 3]));
Результат:
┌─finalizeAggregation(arrayReduce('anyState', [NULL, 2, 3]))─┐
│ 2 │
└────────────────────────────────────────────────────────────┘
Комбинированный пример:
Запрос:
WITH initializeAggregation('sumState', number) AS one_row_sum_state
SELECT
number,
finalizeAggregation(one_row_sum_state) AS one_row_sum,
runningAccumulate(one_row_sum_state) AS cumulative_sum
FROM numbers(10);
Результат:
┌─number─┬─one_row_sum─┬─cumulative_sum─┐
│ 0 │ 0 │ 0 │
│ 1 │ 1 │ 1 │
│ 2 │ 2 │ 3 │
│ 3 │ 3 │ 6 │
│ 4 │ 4 │ 10 │
│ 5 │ 5 │ 15 │
│ 6 │ 6 │ 21 │
│ 7 │ 7 │ 28 │
│ 8 │ 8 │ 36 │
│ 9 │ 9 │ 45 │
└────────┴─────────────┴────────────────┘
Смотрите также
runningAccumulate
Накапливает состояния агрегатной функции для каждой строки блока данных.
!!! warning "Warning" Функция обнуляет состояние для каждого нового блока.
Синтаксис
runningAccumulate(agg_state[, grouping])
Аргументы
agg_state
— состояние агрегатной функции. AggregateFunction.grouping
— ключ группировки. Опциональный параметр. Состояние функции обнуляется, если значениеgrouping
меняется. Параметр может быть любого поддерживаемого типа данных, для которого определен оператор равенства.
Возвращаемое значение
- Каждая результирующая строка содержит результат агрегатной функции, накопленный для всех входных строк от 0 до текущей позиции.
runningAccumulate
обнуляет состояния для каждого нового блока данных или при изменении значенияgrouping
.
Тип зависит от используемой агрегатной функции.
Примеры
Рассмотрим примеры использования runningAccumulate
для нахождения кумулятивной суммы чисел без и с группировкой.
Запрос:
SELECT k, runningAccumulate(sum_k) AS res FROM (SELECT number as k, sumState(k) AS sum_k FROM numbers(10) GROUP BY k ORDER BY k);
Результат:
┌─k─┬─res─┐
│ 0 │ 0 │
│ 1 │ 1 │
│ 2 │ 3 │
│ 3 │ 6 │
│ 4 │ 10 │
│ 5 │ 15 │
│ 6 │ 21 │
│ 7 │ 28 │
│ 8 │ 36 │
│ 9 │ 45 │
└───┴─────┘
Подзапрос формирует sumState
для каждого числа от 0
до 9
. sumState
возвращает состояние функции sum, содержащее сумму одного числа.
Весь запрос делает следующее:
- Для первой строки
runningAccumulate
беретsumState(0)
и возвращает0
. - Для второй строки функция объединяет
sumState (0)
иsumState (1)
, что приводит кsumState (0 + 1)
, и возвращает в результате1
. - Для третьей строки функция объединяет
sumState (0 + 1)
иsumState (2)
, что приводит кsumState (0 + 1 + 2)
, и в результате возвращает3
. - Действия повторяются до тех пор, пока не закончится блок.
В следующем примере показано использование параметра grouping
:
Запрос:
SELECT
grouping,
item,
runningAccumulate(state, grouping) AS res
FROM
(
SELECT
toInt8(number / 4) AS grouping,
number AS item,
sumState(number) AS state
FROM numbers(15)
GROUP BY item
ORDER BY item ASC
);
Результат:
┌─grouping─┬─item─┬─res─┐
│ 0 │ 0 │ 0 │
│ 0 │ 1 │ 1 │
│ 0 │ 2 │ 3 │
│ 0 │ 3 │ 6 │
│ 1 │ 4 │ 4 │
│ 1 │ 5 │ 9 │
│ 1 │ 6 │ 15 │
│ 1 │ 7 │ 22 │
│ 2 │ 8 │ 8 │
│ 2 │ 9 │ 17 │
│ 2 │ 10 │ 27 │
│ 2 │ 11 │ 38 │
│ 3 │ 12 │ 12 │
│ 3 │ 13 │ 25 │
│ 3 │ 14 │ 39 │
└──────────┴──────┴─────┘
Как вы можете видеть, runningAccumulate
объединяет состояния для каждой группы строк отдельно.
joinGet
Функция позволяет извлекать данные из таблицы таким же образом как из словаря.
Получает данные из таблиц Join по ключу.
Поддерживаются только таблицы, созданные с ENGINE = Join(ANY, LEFT, <join_keys>)
.
Синтаксис
joinGet(join_storage_table_name, `value_column`, join_keys)
Аргументы
join_storage_table_name
— идентификатор, который указывает, откуда производится выборка данных. Поиск по идентификатору осуществляется в базе данных по умолчанию (см. конфигурациюdefault_database
). Чтобы переопределить базу данных по умолчанию, используйте командуUSE db_name
, или укажите базу данных и таблицу через разделительdb_name.db_table
, см. пример.value_column
— столбец, из которого нужно произвести выборку данных.join_keys
— список ключей, по которым производится выборка данных.
Возвращаемое значение
Возвращает значение по списку ключей.
Если значения не существует в исходной таблице, вернется 0
или null
в соответствии с настройками join_use_nulls.
Подробнее о настройке join_use_nulls
в операциях Join.
Пример
Входная таблица:
CREATE DATABASE db_test
CREATE TABLE db_test.id_val(`id` UInt32, `val` UInt32) ENGINE = Join(ANY, LEFT, id) SETTINGS join_use_nulls = 1
INSERT INTO db_test.id_val VALUES (1,11)(2,12)(4,13)
┌─id─┬─val─┐
│ 4 │ 13 │
│ 2 │ 12 │
│ 1 │ 11 │
└────┴─────┘
Запрос:
SELECT joinGet(db_test.id_val,'val',toUInt32(number)) from numbers(4) SETTINGS join_use_nulls = 1
Результат:
┌─joinGet(db_test.id_val, 'val', toUInt32(number))─┐
│ 0 │
│ 11 │
│ 12 │
│ 0 │
└──────────────────────────────────────────────────┘
modelEvaluate(model_name, …)
Оценивает внешнюю модель.
Принимает на вход имя и аргументы модели. Возвращает Float64.
throwIf(x[, custom_message])
Бросает исключение, если аргумент не равен нулю. custom_message - необязательный параметр, константная строка, задает текст сообщения об ошибке.
SELECT throwIf(number = 3, 'Too many') FROM numbers(10);
↙ Progress: 0.00 rows, 0.00 B (0.00 rows/s., 0.00 B/s.) Received exception from server (version 19.14.1):
Code: 395. DB::Exception: Received from localhost:9000. DB::Exception: Too many.
identity
Возвращает свой аргумент. Используется для отладки и тестирования, позволяет отменить использование индекса, и получить результат и производительность полного сканирования таблицы. Это работает, потому что оптимизатор запросов не может «заглянуть» внутрь функции identity
.
Синтаксис
identity(x)
Пример
Query:
SELECT identity(42)
Результат:
┌─identity(42)─┐
│ 42 │
└──────────────┘
randomPrintableASCII
Генерирует строку со случайным набором печатных символов ASCII.
Синтаксис
randomPrintableASCII(length)
Аргументы
-
length
— длина результирующей строки. Положительное целое число.Если передать `length < 0`, то поведение функции не определено.
Возвращаемое значение
- Строка со случайным набором печатных символов ASCII.
Тип: String
Пример
SELECT number, randomPrintableASCII(30) as str, length(str) FROM system.numbers LIMIT 3
┌─number─┬─str────────────────────────────┬─length(randomPrintableASCII(30))─┐
│ 0 │ SuiCOSTvC0csfABSw=UcSzp2.`rv8x │ 30 │
│ 1 │ 1Ag NlJ &RCN:*>HVPG;PE-nO"SUFD │ 30 │
│ 2 │ /"+<"wUTh:=LjJ Vm!c&hI*m#XTfzz │ 30 │
└────────┴────────────────────────────────┴──────────────────────────────────┘
randomString
Генерирует бинарную строку заданной длины, заполненную случайными байтами (в том числе нулевыми).
Синтаксис
randomString(length)
Аргументы
length
— длина строки. Положительное целое число.
Возвращаемое значение
- Строка, заполненная случайными байтами.
Type: String.
Пример
Запрос:
SELECT randomString(30) AS str, length(str) AS len FROM numbers(2) FORMAT Vertical;
Ответ:
Row 1:
──────
str: 3 G : pT ?w тi k aV f6
len: 30
Row 2:
──────
str: 9 ,] ^ ) ]?? 8
len: 30
Смотрите также
randomFixedString
Генерирует бинарную строку заданной длины, заполненную случайными байтами, включая нулевые.
Синтаксис
randomFixedString(length);
Аргументы
length
— длина строки в байтах. UInt64.
Возвращаемое значение
- Строка, заполненная случайными байтами.
Тип: FixedString.
Пример
Запрос:
SELECT randomFixedString(13) as rnd, toTypeName(rnd)
Результат:
┌─rnd──────┬─toTypeName(randomFixedString(13))─┐
│ j▒h㋖HɨZ'▒ │ FixedString(13) │
└──────────┴───────────────────────────────────┘
randomStringUTF8
Генерирует строку заданной длины со случайными символами в кодировке UTF-8.
Синтаксис
randomStringUTF8(length)
Аргументы
length
— длина итоговой строки в кодовых точках. UInt64.
Возвращаемое значение
- Случайная строка в кодировке UTF-8.
Тип: String.
Пример
Запрос:
SELECT randomStringUTF8(13)
Результат:
┌─randomStringUTF8(13)─┐
│ 𘤗д兠庇 │
└──────────────────────┘
getSetting
Возвращает текущее значение пользовательской настройки.
Синтаксис
getSetting('custom_setting')
Параметр
custom_setting
— название настройки. String.
Возвращаемое значение
- Текущее значение пользовательской настройки.
Пример
SET custom_a = 123;
SELECT getSetting('custom_a');
Результат
123
См. также
isDecimalOverflow
Проверяет, находится ли число Decimal вне собственной (или заданной) области значений.
Синтаксис
isDecimalOverflow(d, [p])
Аргументы
d
— число. Decimal.p
— точность. Необязательный параметр. Если опущен, используется исходная точность первого аргумента. Использование этого параметра может быть полезно для извлечения данных в другую СУБД или файл. UInt8.
Возвращаемое значение
1
— число имеет больше цифр, чем позволяет точность.0
— число удовлетворяет заданной точности.
Пример
Запрос:
SELECT isDecimalOverflow(toDecimal32(1000000000, 0), 9),
isDecimalOverflow(toDecimal32(1000000000, 0)),
isDecimalOverflow(toDecimal32(-1000000000, 0), 9),
isDecimalOverflow(toDecimal32(-1000000000, 0));
Результат:
1 1 1 1
countDigits
Возвращает количество десятичных цифр, необходимых для представления значения.
Синтаксис
countDigits(x)
Аргументы
Возвращаемое значение
Количество цифр.
Тип: UInt8.
!!! note "Примечание"
Для Decimal
значений учитывается их масштаб: вычисляется результат по базовому целочисленному типу, полученному как (value * scale)
. Например: countDigits(42) = 2
, countDigits(42.000) = 5
, countDigits(0.04200) = 4
. То есть вы можете проверить десятичное переполнение для Decimal64
с помощью countDecimal(x) > 18
. Это медленный вариант isDecimalOverflow.
Пример
Запрос:
SELECT countDigits(toDecimal32(1, 9)), countDigits(toDecimal32(-1, 9)),
countDigits(toDecimal64(1, 18)), countDigits(toDecimal64(-1, 18)),
countDigits(toDecimal128(1, 38)), countDigits(toDecimal128(-1, 38));
Результат:
10 10 19 19 39 39
errorCodeToName
Возвращаемое значение
- Название переменной для кода ошибки.
Тип: LowCardinality(String).
Синтаксис
errorCodeToName(1)
Результат:
UNSUPPORTED_METHOD
tcpPort
Вовращает номер TCP порта, который использует сервер для нативного протокола.
Синтаксис
tcpPort()
Аргументы
- Нет.
Возвращаемое значение
- Номер TCP порта.
Тип: UInt16.
Пример
Запрос:
SELECT tcpPort();
Результат:
┌─tcpPort()─┐
│ 9000 │
└───────────┘
Смотрите также
currentProfiles
Возвращает список профилей настроек для текущего пользователя.
Для изменения текущего профиля настроек может быть использована команда SET PROFILE. Если команда SET PROFILE
не применялась, функция возвращает профили, указанные при определении текущего пользователя (см. CREATE USER).
Синтаксис
currentProfiles()
Возвращаемое значение
- Список профилей настроек для текущего пользователя.
enabledProfiles
Возвращает профили настроек, назначенные пользователю как явно, так и неявно. Явно назначенные профили — это те же профили, которые возвращает функция currentProfiles. Неявно назначенные профили включают родительские профили других назначенных профилей; профили, назначенные с помощью предоставленных ролей; профили, назначенные с помощью собственных настроек; основной профиль по умолчанию (см. секцию default_profile
в основном конфигурационном файле сервера).
Синтаксис
enabledProfiles()
Возвращаемое значение
- Список доступных профилей для текущего пользователя.
defaultProfiles
Возвращает все профили, указанные при объявлении текущего пользователя (см. CREATE USER)
Синтаксис
defaultProfiles()
Возвращаемое значение
- Список профилей по умолчанию.