Meta Query Language (METAQL)
METAQL - Это защищенный SQL для запросов к данным Garpun DataHub. Основан на синтаксисе PostgreSQL.
Особенности
SELECT * FROM ...
не поддерживается- Нельзя называть поля или алиасы зарезервированными именами: date
- Добавлен оператор ILIKE для регистронезависимого сравнения строк
- Поддерживаются только SELECT запросы
- JOIN не поддерживаются
- Работает ограниченный набор функций, описанных ниже
- OR в условиях не поддерживается. Используется AND с отрицанием или IN ( ... )
Функции
Работают функции агрегации:
- MIN, MAX, SUM, AVG
- COUNT(*), COUNT(DISTINCT поле)
- ARRAY_AGG
Функции преобразований:
- ROUND
- CONCAT
- NULLIF
- COALESCE
Внимание! При использовании функций всегда нужно использовать уникальный алиас!
Фильтрация WHERE
Работают операторы сравнения:
- =, !=, >, <, >=, <=
- IN, NOT IN
- LIKE, NOT LIKE
- ILIKE, NOT ILIKE
- BETWEEN
- IS NULL, IS NOT NULL
Оператор GROUP BY
METAQL поддерживает оператор GROUP BY. Как правило, GROUP BY используется вместе с агрегатными функциями (MIN, MAX, SUM, AVG). В этом операторе необходимо указать поля, которые не указаны в агрегатной функции. Допускается использование алиаса поля или названия поля, но не индекса.
Например, этот запрос верный:
SELECT stat_date, account_id as alias_account_id, SUM(cost) as sum_cost
FROM adplatform.campaign_stats_report
WHERE stat_date BETWEEN '2020-01-01' AND '2020-01-05'
GROUP BY stat_date, alias_account_id
А этот нет:
SELECT stat_date, account_id as alias_account_id, SUM(cost) as sum_cost
FROM adplatform.campaign_stats_report
WHERE stat_date BETWEEN '2020-01-01' AND '2020-01-05'
GROUP BY 1, 2
Оператор HAVING
HAVING применяется после группировки для фильтрации по значениям агрегатных функций. Так как этот оператор выполняется перед SELECT, в нем нельзя указать алиас поля, индекс поля или название поля, только функцию.
Например, этот запрос верный:
SELECT stat_date, account_id as alias_account_id, SUM(cost) as sum_cost
FROM adplatform.campaign_stats_report
WHERE stat_date BETWEEN '2020-01-01' AND '2020-01-05'
GROUP BY stat_date, alias_account_id
HAVING SUM(cost) > 1
А этот нет:
SELECT stat_date, account_id as alias_account_id, SUM(cost) as sum_cost
FROM adplatform.campaign_stats_report
WHERE stat_date BETWEEN '2020-01-01' AND '2020-01-05'
GROUP BY 1, 2
HAVING sum_cost > 1
Экранирование
Одинарная кавычка экранируется одинарной кавычкой. Например, еси вам нужно поискать все кампании, в названии которых есть одинарная кавычка, то вам необходимо выполнить такой запрос:
select id, remote_id, name, engine from adplatform.campaign where name like '%''%'
Если нужно поискать клиента по точному совпадению, то принцип будет такой же:
select id, name from adplatform.client where name = 'Тестовый '' проект'
Примеры
Получение статистики по аккаунтам
SELECT
stat_date,
account_id,
SUM(cost) as cost
FROM adplatform.campaign_stats_report
WHERE stat_date BETWEEN '2020-01-01' AND '2020-01-05'
GROUP BY stat_date, account_id
HAVING SUM(cost) > 1
ORDER BY cost DESC
Получение изменившихся клиентов
SELECT id, name, modification_time
FROM adplatform.client
WHERE modification_time > '2020-03-31T12:21:46+0300'