我正在尝试运行 MySQL 查询,但不太确定如何执行。我想计算匹配的连续行数。例如
A A A B B B B A A
我希望结果是3
很容易计算
A
的总数,但我不确定是否只计算出最近的 3 个。
这是我如何列出所有内容的示例
SELECT email,subject FROM tablename where email='[email protected]' and subject='FAIL';
编辑:以下是一些可能有帮助的示例数据。为简单起见,我们只需要 ID 和主题,然后按
ID
订购
ID Subject
1 FAIL
2 FAIL
3 FAIL
4 PASS
5 PASS
6 FAIL
7 PASS
8 FAIL
9 FAIL
结果应该是 3 或 2,具体取决于您的订购方式
ID
我在这里加载了一个SQLfiddle:http://sqlfiddle.com/#!2/5349a/1但是,在您的示例数据中,您有两个ID = 5。我让它独一无二。另外,我的 SQLFiddle 数据不再与您的数据匹配,因为我更改了一些值以确保它有效。玩得开心:)(这可以查看序列的最大 ID 值)
试试这个:
SELECT COUNT(*)
FROM (
SELECT Subject, MAX(ID) AS idlimit
FROM t
GROUP BY Subject
ORDER BY MAX(ID) DESC
LIMIT 1,1) as Temp
JOIN t
ON Temp.idlimit < t.id
这只是一个简单的技巧,如果你找到第一个非失败数据id,你可以轻松计算连续通过的次数。
SELECT count(*) FROM
(SELECT ID FROM tablename
WHERE subject!='FAIL' LIMIT 1)
AS temp
JOIN tablename ON temp.ID > tablename.ID
您可以使用以下方式。我们所需要的只是计算值的变化,例如当前值不等于前一个值。在此示例中,ID 是订单字段,它可以是 id、日期、....
select count(*)+1
FROM T T1
where val<>(select val from T where T.id<T1.id order by id desc LIMIT 1)
count(*)+1
因为第一个序列没有先前的值。
如果您只需要计算具有超过 1 个值的序列,则可以使用以下语句。这里
HAVING count(*)>1
意味着我们只需要行中 2 个或更多值的序列。如果您需要 3 个或更多,请将其更改为 HAVING count(*)>2
等等。
select
count(*)
FROM
(
select
Val,
Grp
from
(
select
T1.id,
T1.val,
(
select
max(id)
from
T
where
T.id < T1.id
and T.val <> T1.Val
) as Grp
FROM
T T1
) T1
group by
GRP
HAVING
count(*)> 1
) T3