2012-06-29 43 views
0

我正在處理一個問題,需要一些專家的意見,以實現這個問題,我的SQL查詢生成輸出與兩列,第一列顯示ID(例如abc-123在下表中),下一列顯示相應的結果存儲在數據庫中的通過或失敗的ID。SQL:如何計算有限的行並重置計數器

我需要實現,當解析通過它應該顯示成功嘗試,在下面的例子中,abc-123第一次失敗,但是def-456在下一次嘗試中通過,因此成功率是50%,現在計數器應該重置並去到下一行,那裏有通過,因此它應該顯示100%,再次代碼命中通過計數器重置然後下一步,並顯示33%,因爲有兩個失敗和一個通過在最後,如何可以在sql中實現? (ID和分辨率都列名)

**date**  **id resolution**  
6/6/2012  abc-123 fail  50% 
6/7/2012  abc-456 pass  
6/8/2012  abc-789 pass  100% 
6/9/2012  abc-799 fail  33% 
6/10/2012 abc-800 fail  
6/1/2012  abc-900 pass 

感謝

+0

寫'o/p'而不是'輸出'只是令人困惑。 –

+0

固定它在身體 – yokoyoko

+2

是否有一些命令或時間戳列來指示下一個之前哪個項目? –

回答

3
SELECT 
    * 
FROM 
    table 
INNER JOIN 
(
    SELECT 
    MIN(g.id) AS first_id, 
    MAX(g.id) AS last_id, 
    COUNT(*) AS group_size 
    FROM 
    table AS p 
    INNER JOIN 
    table AS g 
     ON g.id > COALESCE(
        (SELECT MAX(id) FROM table WHERE id < p.id AND resolution = 'pass'), 
        '' 
       ) 
    AND g.id <= p.id 
    WHERE 
    p.resolution = 'pass' 
    GROUP BY 
    p.id 
) 
    AS groups 
    ON table.id >= groups.first_id 
    AND table.id <= groups.last_id 
+0

我假設你的'id'列是VARCHAR()或類似的。這就是爲什麼我在'COALESCE()'*中使用''''(包含所有的id)*的原因。 – MatBailie

+0

HI Dems,id列是varchar(),我會試一試。謝謝!!! – yokoyoko

+1

@Dems somthing的[不完全正確](http://sqlfiddle.com/#!2/177cb/1) –

2

不止一種方法去做一件事:

SELECT st.*, 
     @prev:[email protected] + 1, 
     @counter:= CASE 
     WHEN st.resolution = 'pass' 
     THEN 0 
     ELSE @counter + 1 
     END c, 
     CASE WHEN @counter = 0 
      THEN CONCAT(FORMAT(100/@prev, 2), '%') 
      ELSE '-' 
     END res 
    FROM so_test st, (SELECT @counter:=0) sc 

這裏的proof of concept

+0

其實,鏈接與分組查詢幫助很大。這個概念本身很簡單:我們有兩個變量,一個(@prev)積累失敗,另一個(@counter)幫助第一個變量,但也像一個獨立的觸發器。 ) – raina77ow

+0

是的,從我的角度來看,這些類型的任務更適合採用某種程序方法。 )但是,然後再次,要求不同。 – raina77ow