我在Postgres 14数据库中有一个表mydata
,它包含以下相关列:
ftype
:具有foo
、bar
和baz
的enum
status
:具有pending
、failed
、success
的另一个enum
我想要不同类型的成功率。成功率基本上是:status
等于success
的行数除以该ftype
的总行数。
目前,我正在执行以下操作:
SELECT
COALESCE(
COUNT(CASE WHEN ftype = 'foo' AND status = 'success' THEN 1 END) /
NULLIF(COUNT(CASE WHEN ftype = 'foo' THEN 1 END)::real, 0)
,0)::real AS foo_rate,
COALESCE(
COUNT(CASE WHEN ftype = 'bar' AND status = 'success' THEN 1 END) /
NULLIF(COUNT(CASE WHEN ftype = 'bar' THEN 1 END)::real, 0)
,0)::real AS bar_rate,
COALESCE(
COUNT(CASE WHEN ftype = 'baz' AND status = 'success' THEN 1 END) /
NULLIF(COUNT(CASE WHEN ftype = 'baz' THEN 1 END)::real, 0)
,0)::real AS baz_rate,
FROM mydata;
是否有更好/更高性能的方法?如何优化它?
在查询中使用PARTITION
是否有帮助?
1条答案
按热度按时间yjghlzjz1#
由于您要计算所有类型的比率,因此枢纽分析的结果会比较简单:
也适用于多种类型。(不过好处较小。)尽早过滤:
关于
WHERE
子句:您可能需要使用
round()
和/或numeric
作为开始。请参阅:关于聚合
FILTER
子句:table partitioning是否有帮助很难从我们所拥有的最少信息中判断出来。手册中的“概述”一章中有关于“表分区”的有用指导。我有根据的猜测是它不会对您有好处。