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

Язык запросов Yupana (YupanaQL)

Для выполнения запросов Yupana поддерживает собственный диалект SQL. Поддерживаются следующие операции:

  • SELECT — выборка данных.
  • UPSERT — вставка данных.
  • KILL QUERY — остановка запроса.
  • DELETE QUERY — удаление запроса из истории.
  • SHOW TABLES — вывод списка таблиц.
  • SHOW COLUMNS FROM <table_name> — вывод списка полей таблицы.
  • SHOW QUERIES — просмотр истории запросов.
  • SHOW UPDATES_INTERVALS - вывод списка изменений временных рядов, произошедших в указанный период.

Правила наименования полей

  1. Время для любой схемы указывается как поле time типа TIMESTAMP. Доступны следующие функции для работы со временем: trunc_second, trunc_minute, trunc_hour, trunc_day, trunc_month, trunc_quarter, trunc_year. extract_second, extract_minute, extract_hour, extract_day, extract_month, extract_quarter, extract_year.

  2. Поля таблицы указываются:

  • как есть (quantity или "quantity")
  • с указанием таблицы ("kkm_items"."quantity" или kkm_items.quantity)
  1. Поля внешних связей указываются в виде имясвязи_имяполя (например ItemsInvertedIndex_phrase).

  2. Фильтровать можно по размерностям, метрикам и полям внешних связей, времени, а также выражениям над ними, используя =, !=, IN ,IS NULL, IS NOT NULL для строк и =, !=, >, >=, <, <=, IN ,IS NULL, IS NOT NULL для остальных типов.

Литералы

Поддерживаются литералы следующих типов:

  1. Строки: 'Hello!'
  2. Числа (целые либо с плавающей запятой): 42 или 1234.567
  3. Даты:
  • TIMESTAMP '2018-08-06'
  • TIMESTAMP '2018-08-06 16:24:50'
  • TIMESTAMP '2018-08-06 16:24:50.123'
  • { ts '2017-06-13' }
  • { ts '2017-06-13 09:15:44' }
  • { ts '2017-06-13 09:15:44.666' }
  1. Интервалы:
  • INTERVAL '06:00:00' — 6 часов
  • INTERVAL '1 12:00:00' — 1 день и 12 часов
  • INTERVAL '1' HOUR — 1 час
  • INTERVAL '30' MINUTE — 30 минут
  • INTERVAL '2 12' DAY TO HOUR — 2 дня 12 часов
  • INTERVAL '6 12:30' DAY TO MINUTE — 6 дней 12 часов 30 минут
  • INTERVAL '3' MONTH — 3 месяца
  • INTERVAL '1' YEAR — 1 год
  • INTERVAL '3-10' MONTH TO DAY — 3 месяца и 10 дней
  1. Массивы: {1, 2, 3,}, { 'one', 'two', 'three' }.
  2. true или false
  3. null
  4. Кортежи арности 2: ('one', 1), (5, TIMESTAMP '2022-05-01').

Важно понимать, что интервалы содержащие месяца и/или годы не могут быть использованы при сравнении длительности интервала между двумя датами. Это обуславливается тем что длина месяца или года зависит от определенной даты.

При выполнении математических операций (плюс или минус) над интервалами можно использовать любые интервалы.

Типы данных

Поддерживаются следующие типы данных:

ТипСоответствующий типа JavaВозможные значения
BOOLEANjava.lang.BooleanTRUE или FALSE
VARCHARjava.lang.StringЛюбая строка
TINYINTjava.lang.Byte-2^7 … 2^7-1
SMALLINTjava.lang.Short-2^16 … 2^16-1
INTEGERjava.lang.Integer-2^32 … 2^32-1
BIGINTjava.lang.Long-2^64 … 2^64-1
DECIMALjava.math.BigDecimalВещественное число
TIMESTAMPjava.sql.TimestampДата и время без временной зоны

При вычислениях с различными числовыми типами точность операндов повышается до типа с большей точностью.

Ручное преобразование типов

Для ручного преобразования типов используется оператор CAST, принимающий тип в качестве параметра. Например:

SELECT item, cast (quantity as decimal) FROM kkm_items
WHERE time >= timestamp '2023-02-01' AND time < timestamp '2023-03-01'