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