Mysql计算匹配的连续行

w6mmgewl  于 2023-10-15  发布在  Mysql
关注(0)|答案(3)|浏览(87)

我试图运行一个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

根据ID的排序方式,结果应该是3或2

fjnneemd

fjnneemd1#

我在这里加载了一个SQLfiddle:http://sqlfiddle.com/#!2/5349 a/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
3hvapo4f

3hvapo4f2#

这只是一个简单的技巧,如果你找到第一个非faildata id,你可以很容易地计算连续的通行证。

SELECT count(*) FROM 
 (SELECT ID FROM tablename 
 WHERE subject!='FAIL' LIMIT 1)
AS temp 
JOIN tablename ON temp.ID > tablename.ID
fivyi3re

fivyi3re3#

您可以使用以下方式。我们所需要的只是计算值的变化,例如。当前值不等于前一个值。在该示例中,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,因为第一个序列没有先前的值。
SQLFiddle演示
如果你只需要计算值大于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

SQLFiddle演示

相关问题