Offset¶
Предупреждение
Функция Offset
в настоящее время недоступна для MySQL/MariaDB, MongoDB и Druid.
Функция Offset
возвращает значение выражения из другой строки. Offset
может использоваться только в блоке "Суммировать" конструктора запросов (вы не можете использовать Offset
для создания произвольного столбца).
Синтаксис: Offset(выражение, смещение-относительно-строки)
выражение
— это значение, которое нужно получить из другой строки.
смещение-относительно-строки
— это число относительно текущей строки. Например, -1
для предыдущей строки или 1
для следующей строки.
Пример: Offset(Sum([Total]), -1)
получит значение Sum([Total])
из предыдущей строки.
Порядок группировок имеет значение¶
Поскольку Offset
ссылается на другие строки, порядок группировок имеет значение (группировки — это группы в разделе "Суммировать" в блоке суммирования). Glarus BI будет сортировать по первой группе, а затем разделять по любым дополнительным группировкам. Например, если вы хотите увидеть количество заказов по категориям продуктов за время и количество по категориям продуктов за предыдущий период, вы должны сначала группировать по Дата создания
, а затем по категории продукта.
Offset не учитывает отсутствующие данные¶
Offset
может ссылаться только на строки, которые у вас есть, что означает, что он может давать правильные, но неожиданные результаты. Например, вы хотите сравнить количество для каждого дня с предыдущим днём.
Возьмите следующую таблицу, где столбец Предыдущий
создан выражением Offset(Count, -1)
:
Дата | Количество | Предыдущий |
---|---|---|
1-окт-24 | 6 | |
2-окт-24 | 3 | 6 |
4-окт-24 | 2 | 3 |
Значение в столбце Предыдущий
для 4 октября равно 3
, это значение предыдущей строки. На основе этих данных противоречий не видно, но предыдущей строкой для 4 октября могло быть 3 октября, которого здесь нет. Если вы хотите использовать offset
для сравнения предыдущих дней (недель или чего-либо ещё), вам нужно убедиться, что ваши данные включают строку для каждой точки данных, которую вы хотите сравнить. В данном случае ваши данные должны включать строку для каждого дня, включая дни, где количество было равно нулю. Если в ваших данных отсутствуют даты, вы можете объединить таблицу календаря с вашими данными, чтобы убедиться, что каждый день представлен строкой в ваших данных.
Типы данных¶
Функция Offset
возвращает любое значение, которое находится в смещённой строке.
Тип данных (документация Metabase, англ.) | Возвращается Offset |
---|---|
Строка | ✅ |
Число | ✅ |
Временна́я метка | ✅ |
Логический | ✅ |
JSON | ✅ |
Пример сравнения временны́х рядов год к году с использованием Offset
¶
В образце базы данных вы можете использовать Offset
для сравнения количества заказов год к году (YoY).
Сначала суммируйте по столбцу итогов. Затем суммируйте снова, на этот раз используя Offset
для получения значения предыдущей строки.
Затем группируйте результаты по полю Дата создания
с разбивкой по годам:
Что это даёт:
С этими смещениями (суммы в столбце "Предыдущий период") мы можем затем создать произвольные столбцы для вычисления разности между годовыми суммами:
И процентное изменение:
Пример скользящего среднего с использованием Offset
¶
Вы можете использовать пользовательское выражение с Offset
для вычисления скользящего среднего.
Например, допустим, вы хотите вычислить скользящую среднюю сумму итогов заказов за последние три месяца. Вы можете создать пользовательское выражение для вычисления:
Приведённое выше выражение складывает итог этого периода плюс итоги за предыдущие два периода (смещение на -1
и -2
), а затем делит на три, чтобы получить среднее значение по этим периодам.
Связанные функции¶
SQL¶
Функция Offset
сравнима с оконными функциями SQL LAG
и LEAD
.
Например, если вы пытаетесь создать линейную диаграмму с двумя сериями для сравнения количества заказов этого месяца с количеством заказов предыдущего месяца, вы бы подсчитали (count
) заказы за этот месяц, а затем использовали выражение offset
для подсчёта заказов предыдущего месяца:
"Под капотом" Glarus BI переведёт это выражение Offset
в оконную функцию LAG
, как в этом запросе:
SELECT
"source"."CREATED_AT" AS "CREATED_AT",
COUNT(*) AS "count",
LAG(COUNT(*), 1) OVER (
ORDER BY
"source"."CREATED_AT" ASC
) AS "Order count previous period"
FROM
(
SELECT
DATE_TRUNC('month', "PUBLIC"."ORDERS"."CREATED_AT") AS "CREATED_AT"
FROM
"PUBLIC"."ORDERS"
) AS "source"
GROUP BY
"source"."CREATED_AT"
ORDER BY
"source"."CREATED_AT" ASC