Язык запросов Yupana (YupanaQL)
Для выполнения запросов Yupana поддерживает собственный диалект SQL. Поддерживаются следующие операции:
SELECT
— выборка данных.UPSERT
— вставка данных.KILL QUERY
— остановка запроса.DELETE QUERY
— удаление запроса из истории.SHOW TABLES
— вывод списка таблиц.SHOW COLUMNS FROM <table_name>
— вывод списка полей таблицы.SHOW QUERIES
— просмотр истории запросов.SHOW UPDATES_INTERVALS
- вывод списка изменений временных рядов, произошедших в указанный период.
Правила наименования полей
Время для любой схемы указывается как поле
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
.Поля таблицы указываются:
- как есть (
quantity
или"quantity"
) - с указанием таблицы (
"kkm_items"."quantity"
илиkkm_items.quantity
)
Поля внешних связей указываются в виде
имясвязи_имяполя
(напримерItemsInvertedIndex_phrase
).Фильтровать можно по размерностям, метрикам и полям внешних связей, времени, а также выражениям над ними, используя
=
,!=
,IN
,IS NULL
,IS NOT NULL
для строк и=
,!=
,>
,>=
,<
,<=
,IN
,IS NULL
,IS NOT NULL
для остальных типов.
Литералы
Поддерживаются литералы следующих типов:
- Строки:
'Hello!'
- Числа (целые либо с плавающей запятой):
42
или1234.567
- Даты:
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' }
- Интервалы:
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, 2, 3,}
,{ 'one', 'two', 'three' }
. true
илиfalse
null
- Кортежи арности 2:
('one', 1)
,(5, TIMESTAMP '2022-05-01')
.
Важно понимать, что интервалы содержащие месяца и/или годы не могут быть использованы при сравнении длительности интервала между двумя датами. Это обуславливается тем что длина месяца или года зависит от определенной даты.
При выполнении математических операций (плюс или минус) над интервалами можно использовать любые интервалы.
Типы данных
Поддерживаются следующие типы данных:
Тип | Соответствующий типа Java | Возможные значения |
---|---|---|
BOOLEAN | java.lang.Boolean | TRUE или FALSE |
VARCHAR | java.lang.String | Любая строка |
TINYINT | java.lang.Byte | -2^7 … 2^7-1 |
SMALLINT | java.lang.Short | -2^16 … 2^16-1 |
INTEGER | java.lang.Integer | -2^32 … 2^32-1 |
BIGINT | java.lang.Long | -2^64 … 2^64-1 |
DECIMAL | java.math.BigDecimal | Вещественное число |
TIMESTAMP | java.sql.Timestamp | Дата и время без временной зоны |
При вычислениях с различными числовыми типами точность операндов повышается до типа с большей точностью.
Ручное преобразование типов
Для ручного преобразования типов используется оператор CAST
, принимающий тип в качестве параметра. Например:
SELECT item, cast (quantity as decimal) FROM kkm_items
WHERE time >= timestamp '2023-02-01' AND time < timestamp '2023-03-01'