如何在Redash中基于count结果列添加查询筛选器
在Redash中添加photo列的筛选条件
我来帮你搞定这个Redash里的筛选需求~你现在的问题是要在现有门店位置筛选的基础上,再对聚合后的photo列做筛选,因为photo是聚合函数计算出来的结果,不能直接用WHERE子句过滤,得用下面两种方法来实现:
方法一:使用HAVING子句直接筛选
HAVING子句专门用来过滤聚合后的分组结果,刚好适合你的场景。修改后的查询如下:
SELECT si.variant_id, v.sku, COUNT(CASE WHEN a.viewable_type = 'Spree::Variant' THEN a.id END) AS photo FROM spree_stock_items si LEFT JOIN spree_stock_locations sl ON sl.id = si.stock_location_id LEFT JOIN spree_assets a ON si.variant_id = a.viewable_id LEFT JOIN spree_variants v ON v.id = si.variant_id WHERE sl.name='{{store_location}}' AND si.deleted_at IS NULL AND sl.country_id = '2' GROUP BY 1, 2 -- 添加HAVING子句筛选photo的数值 HAVING COUNT(CASE WHEN a.viewable_type = 'Spree::Variant' THEN a.id END) {{photo_filter}} ORDER BY 1 LIMIT 200000
Redash参数设置步骤:
- 打开查询编辑页,点击顶部的「参数」按钮;
- 添加新参数,名称填
photo_filter(和查询里的占位符一致); - 参数类型可以选:
- 「文本」:让用户自由输入筛选条件,比如
>= 3、= 0; - 「下拉列表」:预设可选条件,比如添加选项
= 0(无图片)、>= 1(至少1张图片)、= 2(恰好2张图片),方便用户快速选择。
- 「文本」:让用户自由输入筛选条件,比如
方法二:用子查询包装后筛选
如果觉得HAVING里重复写聚合表达式麻烦,可以把原查询作为子查询,在外层用WHERE过滤photo列,逻辑更直观:
SELECT * FROM ( SELECT si.variant_id, v.sku, COUNT(CASE WHEN a.viewable_type = 'Spree::Variant' THEN a.id END) AS photo FROM spree_stock_items si LEFT JOIN spree_stock_locations sl ON sl.id = si.stock_location_id LEFT JOIN spree_assets a ON si.variant_id = a.viewable_id LEFT JOIN spree_variants v ON v.id = si.variant_id WHERE sl.name='{{store_location}}' AND si.deleted_at IS NULL AND sl.country_id = '2' GROUP BY 1, 2 ORDER BY 1 LIMIT 200000 ) AS subquery WHERE photo {{photo_filter}}
注意事项
- 用HAVING时,要保证HAVING里的聚合表达式和SELECT里的完全一致,避免逻辑错误;
- 如果需要范围筛选(比如
photo BETWEEN 1 AND 5),两种方法都支持,只要在参数里输入对应的条件即可; - 保存修改后的查询后,在仪表板里更新这个查询的可视化组件,就能同时通过
store_location和photo_filter两个维度筛选结果啦。
内容的提问来源于stack exchange,提问作者Nur Atiqah




