You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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_locationphoto_filter两个维度筛选结果啦。

内容的提问来源于stack exchange,提问作者Nur Atiqah

火山引擎 最新活动