блог о bi, №1 в рунете

Вывод разных полей датасета в одной колонке таблицы в зависимости от значения фильтра

в Apache Superset

Не редко аналитики в своей работе используют однотипные таблицы для вывода показателей сгруппированных по разным признакам. Вывод плоских таблиц с набором метрик не является проблематичным в Apache Superset. Однако, если таких таблиц много, то может не хватить места в информационной части дашборда. Существует решение с использованием вкладок, но для каждой вкладки необходимо создать собственный чарт, что увеличивает также количество запросов.

Мы нашли решение, позволяющее использовать только один чарт для отображения однотипных таблиц с группировкой по разным колонкам используя внутренний фильтр и Jinja Templates.
1. Создадим тестовый запрос:
select 'col1_param1' as column_1, 'col2_param1' as column_2, 1 as value
union all select 'col1_param1' as column_1, 'col2_param2' as column_2, 2 as value
union all select 'col1_param2' as column_1, 'col2_param3' as column_2, 3 as value
union all select 'col1_param1' as column_1, 'col2_param1' as column_2, 1 as value
union all select 'col1_param1' as column_1, 'col2_param2' as column_2, 2 as value
union all select 'col1_param2' as column_1, 'col2_param3' as column_2, 3 as value
Выводить в таблице необходимо column_1 или column_2 и соответствующее значение value. В итоговом датасете будем использовать его в качестве вложенного запроса. Для начала запросим column_1 как column и value и создадим для него чарт с таблицей.
select column_1 as column, value
from (
select 'col1_param1' as column_1, 'col2_param1' as column_2, 1 as value
union all select 'col1_param1' as column_1, 'col2_param2' as column_2, 2 as value
union all select 'col1_param2' as column_1, 'col2_param3' as column_2, 3 as value
union all select 'col1_param1' as column_1, 'col2_param1' as column_2, 1 as value
union all select 'col1_param1' as column_1, 'col2_param2' as column_2, 2 as value
union all select 'col1_param2' as column_1, 'col2_param3' as column_2, 3 as value
)
2. Создадим датасет для фильтра с названиями колонок и сам фильтр:
Запрос справочника колонок для фильтра
select 'column_1' as column_by
union all select 'column_2' as column_by
3. Теперь необходимо добавить в датасет таблицы выбранное значение фильтра:
Затянуть значение фильтра в запрос можно использовать шаблон Jinja. Чтобы заработали шаблоны, необходимо включить ENABLE_TEMPLATE_PROCESSING флаг функции в superset_config.py. После этого код Python можно встраивать в виртуальные наборы данных.
Для запроса значения фильтра необходимо использовать следующую конструкцию {{ filter_values('column_by', )[0] }}.
Из дашборда переходим в область редактирования чарта:
В настройках чарта переходим в редактирование датасета
Откроется окно редактирования датасета. В ней необходимо нажать на замочек, чтобы открылась возможность редактирования, заменить «column_1» на шаблон jinja и нажать «Save».
Итоговый запрос:
select {{ filter_values('column_by', )[0] }} as column,
value
from (
select 'col1_param1' as column_1, 'col2_param1' as column_2, 1 as value
union all select 'col1_param1' as column_1, 'col2_param2' as column_2, 2 as value
union all select 'col1_param2' as column_1, 'col2_param3' as column_2, 3 as value
union all select 'col1_param1' as column_1, 'col2_param1' as column_2, 1 as value
union all select 'col1_param1' as column_1, 'col2_param2' as column_2, 2 as value
union all select 'col1_param2' as column_1, 'col2_param3' as column_2, 3 as value
)
Вернемся на дашборд и обновим его. Получаемый результат:
Примечания:
  1. Шаблоны Jinja не работают без контекста, т.е. при редактировании чарта вне дашборда значения фильтров необходимо прописывать вручную в области фильтрации чарта.
  2. Если вы все сделали правильно, но фильтр не работает, проверьте настройки Set filter mapping в дашборде: