如何在Apache Superset Preset中用Jinja实现日期过滤?
解决Superset Preset日期范围过滤器适配问题
问题分析
你的原始SQL固定了日期值,需要改为适配Superset的created_date日期范围过滤器。之前的写法错误原因:
- 直接用
=匹配filter_values('created_date'):filter_values返回的是列表(如['2023-03-19', '2023-03-20']),SQL无法识别数组格式,导致语法错误。 - 用
IN拼接列表:当过滤器未选择任何值时,filter_values返回空列表,拼接后会生成IN(''),而日期类型不接受空字符串,引发类型错误。
正确的Jinja改写方案
Superset的日期范围过滤器始终返回包含两个元素的列表:第一个是起始日期,第二个是结束日期(选择单个日期时,结束日期为次日,对应≤ col < 结束日期的逻辑)。结合条件判断避免空过滤器的情况,写法如下:
SELECT order_id, receipt_total, cast(created_at AS date) AS creation_date FROM order_details {% if filter_values('created_date') %} WHERE cast(created_at AS date) >= '{{ filter_values('created_date')[0] }}' AND cast(created_at AS date) < '{{ filter_values('created_date')[1] }}' {% endif %}
说明
{% if filter_values('created_date') %}:判断过滤器是否有选中值,若未选中则不添加WHERE子句,返回所有数据。>= '{{ filter_values('created_date')[0] }}' AND < '{{ filter_values('created_date')[1] }}':完美匹配Superset日期范围过滤器的左闭右开逻辑,不管用户选单个日期还是日期区间都能正确过滤。
内容的提问来源于stack exchange,提问作者Vavonia
相关产品推荐
相关产品推荐

