2011-02-18 33 views
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]    | 
+----------------------+-----------------------+ 

有誰知道,如果有一種方法來一個)獲得一條線上的結果,以及b)能夠計算兩者之間的比率(例如,失敗百分比)。我假設有人會告訴我,我最好爲此編寫一個程序,但如果可能的話,我想避免它。我知道有一個很好的方法可以做到這一點,但我猜我今天缺乏sql-foo。

我正在運行PostgreSQL 9.0.1。感謝您提供的任何幫助。

UPDATE

基於關閉所選擇的答案(來自@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; 

回答

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中,有一個稱爲索引快速全面掃描的訪問路徑,它基本上將索引視爲表。沒有遍歷(慢),只是一個完整的掃描(高效)。好處是{final_event_type}上的索引可能比整個表格要小得多。 (我沒有提到位圖索引,因爲這樣會更快)。

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 
+0

該查詢的原始運行無效......您能解釋一下您的意思嗎? – localshred 2011-02-18 15:02:18

+0

您必須刪除引號,否則查詢將失敗。也許你應該把Total結果轉換爲DECIMAL,否則num_failures/Total將被舍入。 – 2011-02-18 15:04:08