0

問題に対処しており、問題を解決するための専門家のアドバイスが必要です。SQL クエリは 2 つの列で出力を生成します。最初の列には ID (たとえば、次の表の abc-123) が表示され、次の列には保存された ID に対応する結果が表示されます。合格または不合格のデータベースで。

次の例では、abc-123 は 1 回目に失敗しましたが、def-456 は次の試行で合格したため、成功率は 50% になり、カウンターがリセットされて次の行に移動する必要があります。パスがあるため、100% を表示する必要があります。コードがパス カウンターのリセットにヒットすると、次に進み、最後に 2 つの失敗と 1 つのパスがあるため、33% と表示されます。SQL でどのように達成できますか? (id と resolution は列名)

**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

ありがとう

4

2 に答える 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
于 2012-06-29T20:05:16.873 に答える
2

それを行うには複数の方法があります。

SELECT st.*, 
       @prev:=@counter + 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

これが概念実証です。

于 2012-06-29T20:16:15.537 に答える