繁体   English   中英

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

[英]Getting status by N last rows from each group in MySQL

这是简化表( 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';

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

这是使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM