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

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

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

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

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

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