通过MySQL中每个组的N个最后行获取状态

时间:2016-03-13 22:51:30

标签: mysql sql

这是简化表(sqlfiddle):

id  group   status
--  ------  -------
1   group1  success
2   group1  fail
3   group1  success

4   group2  success

5   group3  fail
6   group3  success
7   group3  success
8   group3  success

我需要通过N个最后一行获得每个组的失败结果信息。 像这样(N = 3):

group   has_failures
------  ------------
group1  1
group2  0
group3  0

获取小组非常简单:

-- Select last row from each group:
SELECT a.id,  a.group, a.status
FROM log a
INNER JOIN(
    select max(i.id) as max_id 
    from log i
    group by i.group
) as b on a.id = b.max_id;

也是失败:

-- Select fail status by last 3 rows:
select count(g.status) > 0 as has_failures
from (
       SELECT a.group, a.status
       FROM log a
       WHERE a.group = 'group3'
       ORDER BY id DESC
       LIMIT 3
     ) as g
where g.status = 'fail';

如何将这两个查询合并,或者更简单的方法存在?

1 个答案:

答案 0 :(得分:4)

这是使用user defined variables为每个组建立行号的一个选项。然后,您可以使用conditional aggregation

select max(t.id) id,
  t.group,
  max(case when t.rank = 1 then t.status end) status,
  sum(case when t.status = 'fail' then 1 else 0 end) hasfailures
from (
  select *, 
    case l.group 
      when @curGroup 
      then @curRow := @curRow + 1 
      else @curRow := 1 AND @curGroup := l.group 
    end + 1 AS rank
  from `log` l cross join (select @curRow:=0, @curGroup:='') c
  order by l.group, id desc
  ) t
where rank <= 3
group by t.group