Перейти к содержанию

Ссылки на модели и сохранённые запросы

В базах данных SQL мы можем использовать модель или существующий запрос в качестве основы для нового запроса или в качестве общего табличного выражения CTE (документация Metabase, англ.).

Например, допустим, что есть много данных, разбросанных по нескольким таблицам, но наших пользователей больше всего интересует подмножество этих данных. Мы можем выполнить сложный запрос один раз, чтобы вернуть эти результаты, и сохранить этот запрос как модель, на которую пользователи могут ссылаться в своих запросах так же, как на любую другую таблицу.

Поиск моделей и запросов

Сначала создайте и сохраните запрос, который возвращает набор данных, который вы хотите сделать доступным для последующих запросов. Используя образец базы данных, включённый в 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 год. Мы можем использовать символ # для ссылки на сохранённый запрос в запросе.

Если мы напишем:

SELECT count(*)
FROM {% raw %}{{#{% endraw %}

Glarus BI выдвинет боковую панель, где мы можем выбрать запрос для ссылки. Мы будем искать наш запрос «Заказы Gizmo в 2019 году»:

Выберите запрос на боковой панели переменных

Мы выберем этот запрос, и Glarus BI обновит наш код с идентификатором запроса, 5:

SELECT count(*)
FROM {% raw %}{{#5-gizmo-orders-in-2019}}{% endraw %}

Этот запрос возвращает количество строк в нашем сохранённом запросе.

Модель, таблица или сохранённый запрос в виде общего табличного выражения (CTE)

Тот же синтаксис можно использовать в общем табличном выражении (CTE), документация Metabase (англ.) (с базами данных SQL, которые поддерживают CTE):

WITH gizmo_orders AS {% raw %}{{#5-gizmo-orders-in-2019}}{% endraw %}
SELECT count(*)
FROM gizmo_orders

При выполнении этого запроса тег {% raw %}{{#5-gizmo-orders-in-2019}}{% endraw %} будет заменён 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

Ищите модели и запросы по мере ввода

Используйте поиск по типу вашей переменной, чтобы найти свою модель или запрос. Введите {% raw %}{{#ваш поисковый запрос }} {% endraw %}, и Glarus BI отобразит выбор запроса на боковой панели переменных в редакторе SQL и автоматически добавит идентификационный номер к переменной в запросе.

Вы также можете перейти к модели или запросу, на который хотите сослаться, и найти его идентификатор в URL после /model/ или /question/. Например, для https://metabase.example.com/model/12345-example-name идентификатор модели будет 12345.

Ограничения и компромиссы

  1. Вы можете ссылаться на модель или сохранённый запрос в запросе только при работе с базой данных SQL, такой как PostgreSQL, MySQL или SQL Server.
  2. Выбранная вами модель или сохранённый запрос должны быть основаны на той же базе данных, что и та, которую вы сейчас выбрали в собственном редакторе запросов.
  3. Вы не можете ссылаться на переменные в подзапросах. У вас есть доступ только к результатам модели или сохранённого запроса, но не к модели или сохранённому запросу запроса. Например, если у вас есть сохранённый запрос, в котором используется фильтр полей (документация Metabase, англ.), вы не сможете ссылаться на эту переменную. Если вам нужно изменить способ фильтрации результатов сохранённым запросом, вам потребуется обновить (или продублировать) этот запрос и применить фильтр.

Дополнительная информация