问题描述
我相信这是一个简单的问题,但是由于我对redash不熟悉,所以看起来很难。
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-- viewable_type = 'Spree::Variant'
sl.name='{{store_location}}'
AND si.deleted_at IS NULL
AND sl.country_id = '2'
GROUP BY 1,2
ORDER BY 1
LIMIT 200000
到目前为止,我可以在store location
上过滤结果。但是现在我想基于列query filter
添加photo
。我该怎么做?基本上,我想通过store location
和photo
列中的计数来过滤redash仪表板中的结果。
解决方法
您可以使用having
子句-但这需要重复聚合表达式。例如:
SELECT si.variant_id,v.sku,COUNT(a.id) FILTER(WHERE a.viewable_type = 'Spree::Variant') 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-- viewable_type = 'Spree::Variant'
sl.name='{{store_location}}'
AND si.deleted_at IS NULL
AND sl.country_id = '2'
GROUP BY 1,2
HAVING COUNT(a.id) FILTER(WHERE a.viewable_type = 'Spree::Variant') > 1
ORDER BY 1
LIMIT 200000
请注意,我重写了count()
以使用标准的filter
子句,这使语法更加整洁。
或者,您可以在外部查询中使用子查询和WHERE
子句:
SELECT *
FROM (
SELECT si.variant_id,COUNT(a.id) FILTER(WHERE a.viewable_type = 'Spree::Variant') 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-- viewable_type = 'Spree::Variant'
sl.name='{{store_location}}'
AND si.deleted_at IS NULL
AND sl.country_id = '2'
GROUP BY 1,2
) t
WHERE photo > 1
ORDER BY 1
LIMIT 200000