0

我正在处理一个问题,需要一些专家建议来解决这个问题,我的 sql 查询生成包含两列的输出,第一列显示 id(例如下表中的 abc-123),下一列显示与存储的 id 对应的结果在 db 中是通过还是失败。

我需要实现,当分辨率通过时,它应该显示成功尝试,在下面的示例中,abc-123 第一次失败,但是 def-456 在下一次尝试中通过,因此成功率为 50%,现在计数器应该重置并转到下一行有通过,因此它应该显示 100%,再次当代码命中通过计数器重置然后下一步并显示 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 回答