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

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

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

Это работает следующим образом: сначала создайте и сохраните вопрос, который возвращает набор данных, который вы хотите сделать доступным для последующих запросов. Используя образец базы данных, включенный в GlarusBI в качестве примера, предположим, что мы хотим предоставить результирующий набор («таблицу»), который содержит заказы только с 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 %}

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

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

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

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

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

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

Тот же синтаксис можно использовать в Общем табличном выражении (CTEs) (с базами данных 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 %}, и GlarusBI отобразит выбор вопроса на боковой панели переменных в редакторе SQL и автоматически добавит идентификационный номер к переменной в нашем запросе.

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

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

  • Вы можете ссылаться на модель или сохраненный вопрос в запросе только при работе с базой данных SQL, такой как PostgreSQL, MySQL или SQL Server.

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

  • Вы не можете ссылаться на переменные в подзапросах. У вас есть доступ только к результатам модели или сохраненного вопроса, но не к модели или сохраненному запросу вопроса. Например, если у вас есть сохраненный вопрос, в котором используется фильтр полей, вы не сможете ссылаться на эту переменную. Если вам нужно изменить способ фильтрации результатов сохраненным вопросом, вам потребуется обновить (или продублировать) этот вопрос и применить фильтр.

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