Перейти к основному содержимому
Перейти к основному содержимому

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

Следующие функции предназначены для использования совместно с агрегатными функциями timeSeries*(), такими как timeSeriesInstantRateToGrid, timeSeriesLastToGrid и другими.

seriesDecomposeSTL

Добавлена в версии: v24.1

Разлагает временной ряд с использованием STL (Seasonal-Trend Decomposition Procedure Based on Loess) на сезонную, трендовую и остаточную составляющие.

Синтаксис

seriesDecomposeSTL(series, period)

Аргументы

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

Возвращает массив из четырёх массивов, где первый массив содержит сезонные компоненты, второй массив — тренд, третий массив — остаточную компоненту, а четвёртый массив — базовую компоненту (seasonal + trend). Array(Array(Float32), Array(Float32), Array(Float32), Array(Float32))

Примеры

Разложение данных временного ряда с помощью STL

SELECT seriesDecomposeSTL([10.1, 20.45, 40.34, 10.1, 20.45, 40.34, 10.1, 20.45, 40.34, 10.1, 20.45, 40.34, 10.1, 20.45, 40.34, 10.1, 20.45, 40.34, 10.1, 20.45, 40.34, 10.1, 20.45, 40.34], 3) AS print_0
┌───────────print_0──────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ [[
        -13.529999, -3.1799996, 16.71,      -13.53,     -3.1799996, 16.71,      -13.53,     -3.1799996,
        16.71,      -13.530001, -3.18,      16.710001,  -13.530001, -3.1800003, 16.710001,  -13.530001,
        -3.1800003, 16.710001,  -13.530001, -3.1799994, 16.71,      -13.529999, -3.1799994, 16.709997
    ],
    [
        23.63,     23.63,     23.630003, 23.630001, 23.630001, 23.630001, 23.630001, 23.630001,
        23.630001, 23.630001, 23.630001, 23.63,     23.630001, 23.630001, 23.63,     23.630001,
        23.630001, 23.63,     23.630001, 23.630001, 23.630001, 23.630001, 23.630001, 23.630003
    ],
    [
        0, 0.0000019073486, -0.0000019073486, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.0000019073486, 0,
        0
    ],
    [
        10.1, 20.449999, 40.340004, 10.100001, 20.45, 40.34, 10.100001, 20.45, 40.34, 10.1, 20.45, 40.34,
        10.1, 20.45, 40.34, 10.1, 20.45, 40.34, 10.1, 20.45, 40.34, 10.100002, 20.45, 40.34
    ]]                                                                                                                   │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

seriesOutliersDetectTukey

Введена в версии: v24.2

Обнаруживает выбросы в данных временных рядов с помощью ограждений Тьюки (Tukey Fences).

Синтаксис

seriesOutliersDetectTukey(series[, min_percentile, max_percentile, K])

Аргументы

  • series — массив числовых значений. Array((UInt8/16/32/64)) или Array(Float*)
  • min_percentile — необязательный параметр. Минимальный процентиль, используемый для вычисления межквартильного размаха (IQR). Значение должно быть в диапазоне [0.02, 0.98]. Значение по умолчанию — 0.25. Float*
  • max_percentile — необязательный параметр. Максимальный процентиль, используемый для вычисления межквартильного размаха (IQR). Значение должно быть в диапазоне [0.02, 0.98]. Значение по умолчанию — 0.75. Float*
  • K — необязательный параметр. Неотрицательная константа для обнаружения умеренных или более сильных выбросов. Значение по умолчанию — 1.5. Float*

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

Возвращает массив той же длины, что и входной массив, где каждое значение представляет собой оценку степени возможной аномалии соответствующего элемента в ряду. Ненулевое значение оценки указывает на возможную аномалию. Array(Float32)

Примеры

Простое обнаружение выбросов

SELECT seriesOutliersDetectTukey([-3, 2, 15, 3, 5, 6, 4, 5, 12, 45, 12, 3, 3, 4, 5, 6]) AS print_0
┌───────────print_0─────────────────┐
│[0,0,0,0,0,0,0,0,0,27,0,0,0,0,0,0] │
└───────────────────────────────────┘

Выявление выбросов с настраиваемыми параметрами

SELECT seriesOutliersDetectTukey([-3, 2, 15, 3, 5, 6, 4.50, 5, 12, 45, 12, 3.40, 3, 4, 5, 6], 0.2, 0.8, 1.5) AS print_0
┌─print_0──────────────────────────────┐
│ [0,0,0,0,0,0,0,0,0,19.5,0,0,0,0,0,0] │
└──────────────────────────────────────┘

seriesPeriodDetectFFT

Добавлено в: v23.12

Определяет период заданных данных временного ряда с помощью FFT — быстрого преобразования Фурье

Синтаксис

seriesPeriodDetectFFT(series)

Аргументы

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

Возвращает вещественное значение, равное периоду данных временного ряда. Возвращает NaN, если количество точек данных меньше четырёх. Float64

Примеры

Определение периода по простому паттерну

SELECT seriesPeriodDetectFFT([1, 4, 6, 1, 4, 6, 1, 4, 6, 1, 4, 6, 1, 4, 6, 1, 4, 6, 1, 4, 6]) AS print_0
┌───────────print_0──────┐
│                      3 │
└────────────────────────┘

Определение периода по сложному шаблону

SELECT seriesPeriodDetectFFT(arrayMap(x -> abs((x % 6) - 3), range(1000))) AS print_0
┌─print_0─┐
│       6 │
└─────────┘

timeSeriesCopyTag

Добавлено в версии: v26.1

Копирует указанный тег из одной группы тегов (src_group) в другую (dest_group). Функция заменяет любые предыдущие значения копируемого тега в dest_group. Если копируемый тег отсутствует в src_group, функция также удалит его из dest_group. Функция следует логике копирования модификаторов Prometheus group left/group right.

Синтаксис

timeSeriesCopyTag(dest_group, src_group, tag_to_copy)

Аргументы

  • dest_group — целевая группа тегов. UInt64
  • src_group — исходная группа тегов. UInt64
  • tag_to_copy — имя тега, который нужно скопировать. String

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

Возвращает группу тегов, содержащую теги из dest_group, а также скопированные теги из src_group. UInt64

Примеры

Пример

SELECT timeSeriesTagsToGroup([('region', 'eu'), ('env', 'dev')], '__name__', 'http_requests_count') AS dest_group,
       timeSeriesTagsToGroup([('code', '404'), ('message', 'Page not found')], '__name__', 'http_codes') AS src_group,
       timeSeriesCopyTag(dest_group, src_group, '__name__') AS result_group,
       timeSeriesGroupToTags(result_group)
┌─dest_group─┬─src_group─┬─result_group─┬─timeSeriesGroupToTags(result_group)────────────────────────┐
│          1 │         2 │            3 │ [('__name__','http_codes'),('code','404'),('region','eu')] │
└────────────┴───────────┴──────────────┴────────────────────────────────────────────────────────────┘

timeSeriesCopyTags

Введена в: v26.1

Копирует указанные теги из одной группы тегов (src_group) в другую (dest_group). Функция заменяет все предыдущие значения скопированных тегов в dest_group. Если некоторые из копируемых тегов отсутствуют в src_group, функция также удалит их из dest_group. Функция имитирует логику копирования модификаторов Prometheus group left/group right.

Синтаксис

timeSeriesCopyTags(dest_group, src_group, tags_to_copy)

Аргументы

  • dest_group — целевая группа тегов. UInt64
  • src_group — исходная группа тегов. UInt64
  • tags_to_copy — имена тегов для копирования. Array(String)

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

Возвращает группу тегов, которая содержит теги из dest_group вместе со скопированными тегами из src_group. UInt64

Примеры

Пример

SELECT timeSeriesTagsToGroup([('region', 'eu'), ('env', 'dev')], '__name__', 'http_requests_count') AS dest_group,
       timeSeriesTagsToGroup([('code', '404'), ('message', 'Page not found')], '__name__', 'http_codes') AS src_group,
       timeSeriesCopyTags(dest_group, src_group, ['__name__', 'code', 'env']) AS result_group,
       timeSeriesGroupToTags(result_group)
┌─dest_group─┬─src_group─┬─result_group─┬─timeSeriesGroupToTags(result_group)────────────────────────┐
│          1 │         2 │            3 │ [('__name__','http_codes'),('code','404'),('region','eu')] │
└────────────┴───────────┴──────────────┴────────────────────────────────────────────────────────────┘

timeSeriesExtractTag

Добавлена в: v26.1

Извлекает значение указанного тега из группы. Возвращает NULL, если тег не найден. См. также функцию timeSeriesGroupToTags().

Синтаксис

timeSeriesExtractTag(group)

Аргументы

  • group — Группа тегов. UInt64
  • tag_to_extract — Имя тега, который нужно извлечь из группы. String

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

Возвращает значение указанного тега. Nullable(String)

Примеры

Пример

SELECT timeSeriesTagsToGroup([('region', 'eu'), ('env', 'dev')], '__name__', 'http_requests_count') AS group,
       timeSeriesExtractTag(group, '__name__'),
       timeSeriesExtractTag(group, 'env'),
       timeSeriesExtractTag(group, 'instance')
┌─group─┬─timeSeriesExtractTag(group, '__name__')─┬─timeSeriesExtractTag(group, 'env')─┬─timeSeriesExtractTag(group, 'instance')─┐
│     1 │ http_requests_count                     │ dev                                │ ᴺᵁᴸᴸ                                    │
└───────┴─────────────────────────────────────────┴────────────────────────────────────┴─────────────────────────────────────────┘

timeSeriesFromGrid

Введена в версии: v25.8

Преобразует массив значений [x1, x2, x3, ...] в массив кортежей [(start_timestamp, x1), (start_timestamp + step, x2), (start_timestamp + 2 * step, x3), ...].

Текущая метка времени увеличивается на step до тех пор, пока не станет больше end_timestamp. Если количество значений не совпадает с количеством меток времени, функция выбрасывает исключение.

Значения NULL в [x1, x2, x3, ...] пропускаются, но при этом текущая метка времени всё равно увеличивается. Например, для [value1, NULL, x2] функция возвращает [(start_timestamp, x1), (start_timestamp + 2 * step, x2)].

Синтаксис

timeSeriesFromGrid(start_timestamp, end_timestamp, step, values)

Аргументы

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

Возвращает значения из исходного массива, объединённые с метками времени на регулярной временной сетке, задаваемой start_timestamp и step. Array(Tuple(DateTime64, Float64))

Примеры

Пример использования

SELECT timeSeriesFromGrid('2025-06-01 00:00:00'::DateTime64(3), '2025-06-01 00:01:30.000'::DateTime64(3), 30, [10, 20, NULL, 30]) AS result;
┌─────────────────────────────────────────────result─────────────────────────────────────────────┐
│ [('2025-06-01 00:00:00.000',10),('2025-06-01 00:00:30.000',20),('2025-06-01 00:01:30.000',30)] │
└────────────────────────────────────────────────────────────────────────────────────────────────┘

timeSeriesGroupToTags

Добавлена в версии: v26.1

Возвращает имена и значения тегов, связанных с указанной группой. См. также функцию timeSeriesTagsToGroup().

Синтаксис

timeSeriesGroupToTags(group)

Псевдонимы: timeSeriesTagsGroupToTags

Аргументы

  • group — группа тегов типа UInt64

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

Возвращает массив пар (tag_name, tag_value). Возвращаемый массив всегда отсортирован по tag_name и не содержит повторяющихся значений tag_name. Array(Tuple(String, String))

Примеры

Пример

SELECT timeSeriesTagsToGroup([('region', 'eu'), ('env', 'dev')], '__name__', 'http_requests_count') AS group,
       timeSeriesGroupToTags(group) AS sorted_tags,
       timeSeriesTagsToGroup(sorted_tags) AS same_group,
       throwIf(same_group != group)
┌─group─┬─sorted_tags────────────────────────────────────────────────────────┬─same_group─┬─throwIf(notE⋯up, group))─┐
│     1 │ [('__name__','http_requests_count'),('env','dev'),('region','eu')] │          1 │                        0 │
└───────┴────────────────────────────────────────────────────────────────────┴────────────┴──────────────────────────┘

timeSeriesIdToGroup

Добавлена в версии: v26.1

Возвращает имена и значения тегов, связанных с указанным идентификатором временного ряда. См. также функцию timeSeriesStoreTags().

Синтаксис

timeSeriesIdToGroup(id)

Псевдонимы: timeSeriesIdToTagsGroup

Аргументы

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

Возвращает группу тегов, связанных с идентификатором временного ряда id. UInt64

Примеры

Пример

SELECT 8374283493092 AS id,
       timeSeriesStoreTags(id, [('region', 'eu'), ('env', 'dev')], '__name__', 'http_requests_count') AS same_id,
       throwIf(same_id != id),
       timeSeriesIdToGroup(same_id) AS group,
       timeSeriesGroupToTags(group)
┌────────────id─┬───────same_id─┬─throwIf(notE⋯me_id, id))─┬─group─┬─timeSeriesGroupToTags(group)───────────────────────────────────────┐
│ 8374283493092 │ 8374283493092 │                        0 │     1 │ [('__name__','http_requests_count'),('env','dev'),('region','eu')] │
└───────────────┴───────────────┴──────────────────────────┴───────┴────────────────────────────────────────────────────────────────────┘

timeSeriesIdToTags

Появилась в версии: v25.8

Возвращает теги, связанные с указанным идентификатором временного ряда. См. также функцию timeSeriesStoreTags().

Синтаксис

timeSeriesIdToTags(id)

Аргументы

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

Возвращает массив пар (tag_name, tag_value). Возвращаемый массив всегда отсортирован по tag_name и не содержит повторяющихся значений tag_name. Array(Tuple(String, String))

Примеры

Пример

SELECT 8374283493092 AS id,
       timeSeriesStoreTags(id, [('region', 'eu'), ('env', 'dev')], '__name__', 'http_requests_count') AS same_id,
       throwIf(same_id != id),
       timeSeriesIdToTags(same_id)
┌────────────id─┬───────same_id─┬─throwIf(notE⋯me_id, id))─┬─timeSeriesIdToTags(same_id)────────────────────────────────────────┐
│ 8374283493092 │ 8374283493092 │                        0 │ [('__name__','http_requests_count'),('env','dev'),('region','eu')] │
└───────────────┴───────────────┴──────────────────────────┴────────────────────────────────────────────────────────────────────┘

timeSeriesJoinTags

Добавлена в: v26.1

Объединяет значения указанных тегов, извлечённых из группы тегов. Функция вставляет разделитель между объединёнными значениями и возвращает новую группу тегов с тегом dest_tag, установленным в объединённое значение. Эта функция воспроизводит логику функции Prometheus label_join().

Синтаксис

timeSeriesJoinTags(group, dest_tag, separator, src_tags)

Аргументы

  • group — группа тегов. UInt64
  • dest_tag — имя тега с объединённым результатом, который будет добавлен в group. String
  • separator — разделитель, вставляемый между объединяемыми значениями. String
  • src_tags — имена исходных тегов со значениями, которые будут объединены. Array(String)

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

Возвращает новую группу тегов с тегом dest_tag, установленным в значение объединённого результата. UInt64

Примеры

Пример

SELECT timeSeriesTagsToGroup([('__name__', 'up'), ('job', 'api-server'), ('src1', 'a'), ('src2', 'b'), ('src3', 'c')]) AS group,
       timeSeriesJoinTags(group, 'foo', ',', ['src1', 'src2', 'src3']) AS result_group,
       timeSeriesGroupToTags(result_group)
┌─group─┬─result_group─┬─timeSeriesGroupToTags(result_group)─────────────────────────────────────────────────────────────┐
│     1 │            2 │ [('__name__','up'),('foo','a,b,c'),('job','api-server'),('src1','a'),('src2','b'),('src3','c')] │
└───────┴──────────────┴─────────────────────────────────────────────────────────────────────────────────────────────────┘

timeSeriesRange

Введена в версии: v25.8

Генерирует диапазон меток времени [start_timestamp, start_timestamp + step, start_timestamp + 2 * step, ..., end_timestamp].

Если start_timestamp равен end_timestamp, функция возвращает массив из одного элемента, содержащий [start_timestamp].

Функция timeSeriesRange() аналогична функции range.

Синтаксис

timeSeriesRange(start_timestamp, end_timestamp, step)

Аргументы

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

Возвращает диапазон меток времени. Array(DateTime64)

Примеры

Пример использования

SELECT timeSeriesRange('2025-06-01 00:00:00'::DateTime64(3), '2025-06-01 00:01:00'::DateTime64(3), 30)
┌────────────────────────────────────result─────────────────────────────────────────┐
│ ['2025-06-01 00:00:00.000', '2025-06-01 00:00:30.000', '2025-06-01 00:01:00.000'] │
└───────────────────────────────────────────────────────────────────────────────────┘

timeSeriesRemoveAllTagsExcept

Добавлена в версии v26.1

Удаляет все теги, кроме указанных, из группы тегов. См. также функции timeSeriesRemoveTag(), timeSeriesRemoveTags().

Синтаксис

timeSeriesRemoveAllTagsExcept(group, tags_to_keep)

Аргументы

  • group — группа тегов. UInt64
  • tags_to_keep — имена тегов, которые нужно оставить в группе. Array(String)

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

Новая группа тегов, в которой сохранены только указанные теги. UInt64

Примеры

Пример

SELECT timeSeriesTagsToGroup([('region', 'eu'), ('env', 'dev')], '__name__', 'http_requests_count') AS group,
       timeSeriesRemoveAllTagsExcept(group, ['env']) AS result_group,
       timeSeriesGroupToTags(result_group)
┌─group─┬─result_group─┬─timeSeriesGroupToTags(result_group)─┐
│     1 │            2 │ [('env','dev')]                     │
└───────┴──────────────┴─────────────────────────────────────┘

timeSeriesRemoveTag

Введена в версии v26.1

Удаляет указанный тег из группы тегов. Если в группе нет такого тега, группа возвращается без изменений. См. также функции timeSeriesRemoveTags(), timeSeriesRemoveAllTagsExcept().

Синтаксис

timeSeriesRemoveTag(group, tag_to_remove)

Аргументы

  • group — группа тегов. UInt64
  • tag_to_remove — имя тега, который нужно удалить из группы. String

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

Новая группа тегов без указанного тега. UInt64

Примеры

Пример

SELECT timeSeriesTagsToGroup([('region', 'eu'), ('env', 'dev')], '__name__', 'http_requests_count') AS group_of_3,
       timeSeriesRemoveTag(group_of_3, '__name__') AS group_of_2,
       timeSeriesGroupToTags(group_of_2),
       timeSeriesRemoveTag(group_of_2, 'env') AS group_of_1,
       timeSeriesGroupToTags(group_of_1),
       timeSeriesRemoveTag(group_of_1, 'region') AS empty_group,
       timeSeriesGroupToTags(empty_group)
┌─group_of_3─┬─group_of_2─┬─timeSeriesGroupToTags(group_of_2)─┬─group_of_1─┬─timeSeriesGroupToTags(group_of_1)─┬─empty_group─┬─timeSeriesGroupToTags(empty_group)─┐
│          1 │          2 │ [('env','dev'),('region','eu')]   │          3 │ [('region','eu')]                 │           0 │ []                                 │
└────────────┴────────────┴───────────────────────────────────┴────────────┴───────────────────────────────────┴─────────────┴────────────────────────────────────┘

timeSeriesRemoveTags

Впервые появилась в версии v26.1

Удаляет указанные теги из группы тегов. Если некоторых из указанных тегов нет в группе тегов, функция их игнорирует. См. также функции timeSeriesRemoveTag(), timeSeriesRemoveAllTagsExcept().

Синтаксис

timeSeriesRemoveTags(group, tags_to_remove)

Аргументы

  • group — Группа тегов. UInt64
  • tags_to_remove — Имена тегов, которые нужно удалить из группы. Array(String)

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

Новая группа тегов без указанных тегов. UInt64

Примеры

Пример

SELECT timeSeriesTagsToGroup([('region', 'eu'), ('env', 'dev')], '__name__', 'http_requests_count') AS group_of_3,
       timeSeriesRemoveTags(group_of_3, ['env', 'region']) AS group_of_1,
       timeSeriesGroupToTags(group_of_1),
       timeSeriesRemoveTags(group_of_1, ['__name__', 'nonexistent']) AS empty_group,
       timeSeriesGroupToTags(empty_group)
┌─group_of_3─┬─group_of_1─┬─timeSeriesGroupToTags(group_of_1)────┬─empty_group─┬─timeSeriesGroupToTags(empty_group)─┐
│          1 │          2 │ [('__name__','http_requests_count')] │           0 │ []                                 │
└────────────┴────────────┴──────────────────────────────────────┴─────────────┴────────────────────────────────────┘

timeSeriesReplaceTag

Впервые представлено в: v26.1

Сопоставляет регулярное выражение regex со значением тега src_tag. Если сопоставление успешно, значение тега dest_tag в результирующем наборе будет подстановкой replacement, вместе с исходными тегами во входных данных. Эта функция имитирует логику функции prometheus label_replace().

Синтаксис

timeSeriesReplaceTag(group, dest_tag, replacement, src_tag, regex)

Аргументы

  • group — группа тегов. UInt64
  • dest_tag — имя целевого тега, в который записывается результирующая группа. String
  • replacement — шаблон замены, может содержать 1,1, 2 или $name для обращения к захватывающим группам в регулярном выражении «regex». String
  • src_tag — имя тега, значение которого используется для сопоставления с регулярным выражением «regex». String
  • regex — регулярное выражение. String

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

Новая группа тегов, возможно с добавлением dest_tag. UInt64

Примеры

Пример

SELECT timeSeriesTagsToGroup([('__name__', 'up'), ('job', 'api-server'), ('service', 'a:c')]) AS group,
       timeSeriesReplaceTag(group, 'foo', '$1', 'service', '(.*):.*') AS result_group,
       timeSeriesGroupToTags(result_group)
┌─group─┬─result_group─┬─timeSeriesGroupToTags(result_group)────────────────────────────────────┐
│     1 │            2 │ [('__name__','up'),('foo','a'),('job','api-server'),('service','a:c')] │
└───────┴──────────────┴────────────────────────────────────────────────────────────────────────┘

timeSeriesStoreTags

Добавлено в версии: v25.8

Сохраняет в контексте запроса соответствие между указанным идентификатором временного ряда и набором тегов. Функции timeSeriesIdToTags() и timeSeriesIdToGroup() могут использоваться для доступа к этому соответствию позже во время выполнения запроса.

Синтаксис

timeSeriesStoreTags(id, tags_array, separate_tag_name_1, separate_tag_value_1, ...)

Аргументы

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

Возвращает идентификатор временного ряда (т. е. просто первый аргумент).

Примеры

Пример

SELECT 8374283493092 AS id,
       timeSeriesStoreTags(id, [('region', 'eu'), ('env', 'dev')], '__name__', 'http_requests_count') AS same_id,
       throwIf(same_id != id),
       timeSeriesIdToTags(same_id),
       timeSeriesGroupToTags(timeSeriesIdToGroup(same_id))
┌────────────id─┬───────same_id─┬─throwIf(notEquals(same_id, id))─┬─timeSeriesIdToTags(same_id)────────────────────────────────────────┬─timeSeriesGroupToTags(timeSeriesIdToGroup(same_id))────────────────┐
│ 8374283493092 │ 8374283493092 │                               0 │ [('__name__','http_requests_count'),('env','dev'),('region','eu')] │ [('__name__','http_requests_count'),('env','dev'),('region','eu')] │
└───────────────┴───────────────┴─────────────────────────────────┴────────────────────────────────────────────────────────────────────┴────────────────────────────────────────────────────────────────────┘

timeSeriesTagsToGroup

Введена в версии v26.1

Возвращает группу тегов, связанную с указанными тегами. Если одна и та же группа тегов встречается несколько раз при выполнении запроса, функция возвращает одну и ту же группу. Для пустого набора тегов функция всегда возвращает значение 0. См. также функцию timeSeriesGroupToTags().

Синтаксис

timeSeriesTagsToGroup(tags_array, tag_name_1, tag_value_1, tag_name2, tag_value2, ...)

Аргументы

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

Возвращает группу тегов, связанную с указанными тегами. UInt64

Примеры

Пример

SELECT timeSeriesTagsToGroup([('region', 'eu'), ('env', 'dev')], '__name__', 'http_requests_count') AS group1,
       timeSeriesTagsToGroup([], '__name__', 'http_failures') AS group2,
       timeSeriesTagsToGroup([]) AS empty_group,
       timeSeriesTagsToGroup([], '__name__', 'http_failures') AS same_group2,
       throwIf(same_group2 != group2),
       timeSeriesGroupToTags(group2)
┌─group1─┬─group2─┬─empty_group─┬─same_group2─┬─throwIf(notEquals(same_group2, group2))─┬─timeSeriesGroupToTags(group2)──┐
│      1 │      2 │           0 │           2 │                                       0 │ [('__name__','http_failures')] │
└────────┴────────┴─────────────┴─────────────┴─────────────────────────────────────────┴────────────────────────────────┘