[英]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.