Apache Superset中多列关联的筛选排序及Jinja模板下的关联过滤问题
Apache Superset中多列关联的筛选排序及Jinja模板下的关联过滤问题
我来帮你一步步搞定这两个需求哈,分两部分来说明:
一、让仪表盘筛选器显示name字段,同时按order列排序
要实现这个效果,核心是给name字段设置排序依赖的列,具体步骤如下:
- 首先找到你的目标数据集,进入编辑数据集页面(鼠标悬停在数据集上,点铅笔图标即可)
- 在数据集编辑页面的列配置区域,找到
name列,点击编辑按钮 - 在弹出的列编辑窗口里,找到「排序依据(Sort By)」的下拉选项,选择
order列,再根据需求设置排序方向(升序/降序) - 保存数据集的修改,回到仪表盘编辑页面
- 添加一个筛选器组件,在筛选器配置里选择你的数据集,把
name设为筛选字段 - 这样设置后,筛选器里的name选项就会按照order列的顺序来排列啦
二、在Jinja模板中,用选中name对应的order值进行数据过滤
这里的关键是先通过选中的name拿到对应的order值,再把这个值用在WHERE子句里,具体操作如下:
- 首先确保你的数据集是自定义SQL查询类型的(如果之前是直接选物理表创建的,可以转成SQL Lab的自定义查询)
- 在SQL语句里,用Superset的Jinja变量
{{ filter_values('name') }}获取用户选中的name值(这是一个列表,单个选择的话用{{ filter_values('name')[0] }}就能拿到选中的那个值) - 然后通过子查询的方式,把name对应的order值关联出来,再用于过滤。举几个实用的例子:
- 如果name和order是一对一的关系:
SELECT * FROM your_target_table WHERE order = ( SELECT order FROM your_target_table WHERE name = '{{ filter_values('name')[0] }}' )- 如果支持多选name,就要用IN匹配,同时处理多值的情况:
这里的SELECT * FROM your_target_table WHERE order IN ( SELECT order FROM your_target_table WHERE name IN ({{ filter_values('name') | map('quote') | join(', ') }}) )map('quote')是给每个name值加上单引号,避免SQL语法错误,join(', ')则是把多个name值用逗号分隔开。
一些注意事项
- 要确保name和order列的关联关系正确,比如一个name对应唯一的order,或者符合你需要的关联逻辑
- 写完SQL后可以先在SQL Lab里测试,手动替换
{{ filter_values('name')[0] }}为具体的name值,看看查询结果是否符合预期 - 如果数据集基于视图或其他复杂逻辑,要注意子查询的性能问题
备注:内容来源于stack exchange,提问作者Tavakoli
相关产品推荐
相关产品推荐

