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'