我正在处理一个问题并需要一些专家建议来实现这个问题,我的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
谢谢
答案 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