我需要获取最少的数据量。我当前的SQL是
select min(count(*)) from table group by id ;
我希望得到最小数量的变量count(*)。似乎不允许上述查询。错误
aggregate function calls cannot be nested
被抛出。有没有办法使用任何交替方法来实现这一目标?
答案的数量证明了存在许多解决方案。有趣的是,@ ahorse_with_no_name质疑它们每个的性能。
SELECT MIN(count) FROM (SELECT COUNT(*) FROM table GROUP BY id) t;
它通常产生以下计划:
Aggregate
-> HashAggregate
-> Seq Scan on table
SELECT COUNT(*) FROM table GROUP BY id ORDER BY 1 LIMIT 1;
对于某些人来说,感觉更自然,但不幸的是产生了第二种:
Limit
-> Sort
Sort Key: (count(*))
-> HashAggregate
-> Seq Scan on table
WITH cte AS (SELECT count(*) FROM table GROUP BY id) SELECT MIN(count) FROM cte;
它与子查询非常相似,除了计划显示已扫描CTE(如果表很大,可以实现)。
Aggregate
CTE cte
-> HashAggregate
-> Seq Scan on table
-> CTE Scan on cte
或者,您可以将窗口聚合函数与LIMIT结合使用,而不必进行第二种排序。
SELECT MIN(COUNT(*)) OVER () FROM table GROUP BY id LIMIT 1;
它产生一个与子查询方法等效的计划(如果我们认为LIMIT 1
几乎是免费的)。
Limit
-> WindowAgg
-> HashAggregate
-> Seq Scan on table
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句