SQL:如何计算有限行并重置计数器

时间:2012-06-29 19:43:55

标签: mysql sql

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

我需要实现,当分辨率通过时它应该显示成功尝试,在下面的例子中,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

谢谢

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

这是proof of concept