Ссылки на модели и сохранённые запросы¶
В базах данных SQL мы можем использовать модель или существующий запрос в качестве основы для нового запроса или в качестве общего табличного выражения CTE (документация Metabase, англ.).
Например, допустим, что есть много данных, распределённых по нескольким таблицам, но наших пользователей больше всего интересует подмножество этих данных. Мы можем выполнить сложный запрос один раз, чтобы вернуть эти результаты, и сохранить этот запрос как модель, на которую пользователи могут ссылаться в своих запросах так же, как на любую другую таблицу.
Поиск моделей и запросов по мере ввода¶
Сначала создайте и сохраните запрос или модель, который возвращает результирующий набор, который вы хотели бы сделать доступным для последующих запросов.
Чтобы сослаться на этот запрос или модель в SQL-запросе, используйте поиск с автодополнением в переменной с префиксом #
.
Введите {{#ваш поисковый запрос}}
, и Glarus BI отобразит список моделей и запросов, соответствующих вашему поисковому запросу.
Вы также можете найти идентификатор запроса или модели, перейдя в Glarus BI к модели или запросу, на который вы хотите сослаться в своём запросе. Идентификатор находится в URL-адресе в адресной строке вашего браузера. Идентификатором будет число после /model/
или /question/
. Например, для https://metabase.example.com/model/12345-example-name
идентификатор модели будет 12345
.
Требуются только #
и ID
. Glarus BI просто отображает имя модели или запроса, чтобы запрос легче читался.
Пример ссылки на сохранённую модель¶
Используя образец базы данных, включённый в Glarus BI в качестве примера, предположим, что мы хотим предоставить результирующий набор («таблицу»), который содержит заказы только с 2019 года и включает только заказы на продукты в категории Gizmo.
Мы могли бы создать эту модель с помощью редактора «Блокнот», например:
В качестве альтернативы мы могли бы создать эту модель из запроса SQL:
SELECT *
FROM orders AS o
INNER JOIN products AS p
ON o.product_id = p.id
WHERE p.category = 'Gizmo'
AND o.created_at BETWEEN '2019-01-01' AND '2019-12-31'
Мы сохраним этот запрос как «Заказы Gizmo в 2019 году», а затем преобразуем его в модель.
Теперь давайте обратимся к «Заказы Gizmo в 2019 году» в новом запросе. Для простоты предположим, что мы просто хотим подсчитать все эти заказы Gizmo за 2019 год. Мы можем использовать символ #
для ссылки на сохранённую модель в запросе.
Если мы напишем:
Glarus BI выдвинет боковую панель, где мы можем выбрать модель для ссылки. Мы будем искать «Заказы Gizmo в 2019 году»:
Мы выберем эту модель, и Glarus BI обновит наш код с идентификатором запроса, 5
:
Этот запрос возвращает количество строк в нашей сохранённой модели.
Модель, таблица или сохранённый запрос в виде общего табличного выражения (CTE)¶
Тот же синтаксис можно использовать в общих табличных выражениях CTE (документация Metabase, англ.) с базами данных SQL, которые поддерживают CTE:
При выполнении этого запроса тег {{#5-gizmo-orders-in-2019}}
будет заменён SQL-запросом, заключённым в круглые скобки. Итак, «под капотом» это будет выглядеть так:
WITH
gizmo_orders AS (
SELECT
*
FROM
orders AS o
INNER JOIN products AS p ON o.product_id = p.id
WHERE
p.category = 'Gizmo'
AND o.created_at BETWEEN '2019-01-01' AND '2019-12-31'
)
SELECT
count(*)
FROM
gizmo_orders
Ограничения и компромиссы¶
- Вы можете ссылаться на модель или сохранённый запрос в запросе только при работе с базой данных SQL, такой как PostgreSQL, MySQL, Snowflake или SQL Server.
- Выбранная вами модель или сохранённый запрос должны быть основаны на той же базе данных, что и та, которую вы сейчас выбрали в редакторе прямых запросов.
- Вы не можете ссылаться на переменные в подзапросах. У вас есть доступ только к результатам модели или сохранённого запроса, но не к модели или сохранённому запросу. Например, если у вас есть сохранённый запрос, в котором используется фильтр полей (документация Metabase, англ.), вы не сможете ссылаться на эту переменную. Если вам нужно изменить способ фильтрации результатов сохранённым запросом, вам потребуется обновить (или продублировать) этот запрос и применить фильтр.