대시보드는 다양한 Question들을 한데 모아서 시각화한 중앙 관제판 개념으로, 대시보드 내의 Question들에 일괄적으로 적용할 수 있는 Filter가 존재한다.
이번에는 Question과 대시보드에서 사용되는 변수와 필터를 알아보도록 한다.
Filter
Question에 적용할 수 있는 '어떤 값을 나타낼 지'를 결정하는 변수
Metabase에서는 대시보드 widget 형태로 filter를 지원한다. 대시보드 편집 모드로 전환하면 아래같이 다양한 타입의 filter를 생성할 수 있다.
이렇게 Filter를 만든 뒤, 대시보드의 각 Question에 대해 적용하도록 바인딩을 해주어야 한다. 바인딩이 되면, 대시보드상의 filter를 지정함과 동시에 바인딩된 모든 쿼리에 필터가 적용되는 것이다.
대시보드에 생성한 filter는 동일한 대시보드 내의 여러 탭에서 사용할 수 있다. 즉, 다른 탭에 있는 Question에도 바인딩할 수 있다는 것이다.
바인딩할 수 있는 대상에는 각 Question의 Column 뿐만 아니라 Question 내에서 선언한 Field filter와 SQL 변수도 포함되어 있다.
SQL Variables
SQL 기반 Question에서 사용할 수 있는 변수
SQL 구문 상에서 `{{변수명}}`형태로 작성하면 변수를 선언할 수 있다. SQL editor에서 쿼리에 변수를 선언하면 우측 패널에 '변수설정' 패널을 볼 수 있다.
이를 통해서 이 변수의 타입, 라벨, 기본값을 지정하는 것부터 변수의 입력 방법과 단일/다중 선택에 대한 옵션도 지정해줄 수 있다.
Dropdown list나 Search box를 선택하면, 다른 Model이나 Question으로부터 입력값을 가져올 수도 있고, Custom list를 통해서 직접 입력값 후보를 지정해줄 수도 있다.
Field Filter
Question의 SQL Variable 중 데이터베이스 필드에 접근할 수 있는 특수한 변수
앞서 보았던 SQL 변수와 동일하게 WHERE 절에서 중괄호로 선언해주나, WHERE절에서 연산자 없이 바로 Column명을 지정해서 SQL을 작성한다는 것이다.
# 기본 SQL 변수를 사용했을때
select * from ORDERS where quantity >= {{target_count}};
# Field filter를 사용했을때
select * from ORDERS where {{quantity}};
그리고 '변수설정' 패널에서 변수 타입을 'Field Filter'로 지정하고, 연결할 칼럼(필드)를 지정하면 사용할 수 있다.
해당 쿼리에서 custom하게 만든 칼럼의 경우, Field filter를 사용할 수 없고, 일반 SQL 변수를 이용해야한다.
Optional Variables
Question의 SQL 변수 중 Optional하게 지정할 변수
변수가 포함된 절을 대괄호로 묶어주며, 이 부분은 해당 변수가 지정되지 않은 경우, 빈 값으로 처리된다.
SELECT count(*) FROM products [[WHERE category = {{cat}}]]
즉, 해당 변수가 포함된 절을 묶어주지 않은 경우, 유효하지 않은 쿼리가 완성될 수 있다는 것이다.
SELECT count(*) FROM products WHERE [[category = {{cat}}]]
# cat 변수가 없으면 빈 값으로 처리, Invalid하게 완성됨
SELECT count(*) FROM products WHERE
그렇기에 WHERE 절에 2개 이상의 Optional Variable을 지정하려면 아래와 같이 최소한의 WHERE 문을 남겨두고, 각 Optional Variable은 AND로 시작하도록 묶어야한다.
# 2개 이상의 Optional Variable에서는 아래처럼
SELECT
count(*)
FROM
products
WHERE
TRUE
[[AND id = {{id}}]]
[[AND {{category}}]]