1

我正在尝试微调查询并希望得到一些反馈。我有一个job_fact仓库表,其中包含作业的最终事件 ( final_event_type) 的计量单位。我正在尝试对将给我一个成功/失败比率的事实进行查询。这是我到目前为止所拥有的:

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;
4

2 回答 2

3

如果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}要扫描的索引可能比整个表要小得多。(我没有提到位图索引,因为那样会更快)。

于 2011-02-18T15:52:23.327 回答
1
SELECT num_failures, num_successesc, (num_failures/Total), (num_successesc/Total)
FROM (
SELECT 
(SELECT COUNT(*) FROM job_fact WHERE final_event_type IN (4,6,8,9)) AS "num_failures"
(SELECT COUNT(*) FROM job_fact WHERE final_event_type IN (5,7,10)) AS "num_successesc"
(SELECT COUNT(*) FROM job_fact WHERE final_event_type IN (4,6,8,9,5,7,10)) AS "Total"
) PQ
于 2011-02-18T14:50:50.380 回答