这是简化表(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';
如何将这两个查询合并,或者更简单的方法存在?
答案 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