从仓库事实表中获取成功/失败比率的最佳查询

收藏

我正在尝试微调一个查询,希望得到一些反馈。我有一个仓库表,其中包含作业最终事件的度量单位(job_fact)。我试着对这个事实进行一个查询,这将给我一个成功/失败的比率。以下是我目前掌握的情况:

SELECT
  CASE WHEN jf.final_event_type IN (4,6,8,9) THEN count(final_event_type) END as num_failures,
  CASE WHEN jf.final_event_type IN (5,7,10) THEN count(final_event_type) END as num_successes
FROM job_fact jf
GROUP BY jf.final_event_type;

此查询只提供两行结果中的原始成功和失败值:
+----------------------+-----------------------+
| num_failures         | num_successes         |
+----------------------+-----------------------+
| [NULL]               | 6                     |
| 14                   | [NULL]                |
+----------------------+-----------------------+

有没有人知道有没有办法a)在一条线上得到结果,b)能够计算出两者之间的比率(例如,失败百分比)。我想有人会告诉我,我最好写一个程序,但我想避免它,如果可能的话。我知道有一种优雅的方法可以做到这一点,但我想我的sql foo现在还没有。
我在运行PostgreSQL 9.0.1。谢谢你的帮助。
更新
根据选择的答案(来自@Ronnis),下面是我的最后一个查询,以防您想知道:
select
  sum(case when final_event_type in(4,6,8,9) then 1 else 0 end) as failures,
  sum(case when final_event_type in(5,7,10)  then 1 else 0 end) as successes,
count(final_event_type) as total_events,
  sum(case when final_event_type in(4,6,8,9) then 1 else 0 end) / count(final_event_type)::decimal as failure_percentage,
  sum(case when final_event_type in(5,7,10) then 1 else 0 end) / count(final_event_type)::decimal as success_percentage
from job_fact;


最佳答案:

如果where final_event_type in(4,5,6,7,8,9,10)会在大多数情况下出现,我认为以下几点会非常有效:

select sum(case when final_event_type in(4,6,8,9) then 1 else 0 end) as failures
      ,sum(case when final_event_type in(5,7,10)  then 1 else 0 end) as successes
 from job_fact;

编辑
我不知道postgresq是如何执行上述查询的。在Oracle中,有一个名为Index Fast Full scan的访问路径,它基本上将索引视为表。没有遍历(慢),只有全扫描(高效)。这样做的好处是{final_event_type}上的索引可以比整个表要小得多。
(我没有提到位图索引,因为那样会更快)。

回复