【问题标题】:Mysql Counting the consecutive rows that matchMysql 计算匹配的连续行
【发布时间】:2019-10-06 20:15:26
【问题描述】:

我正在尝试运行 MySQL 查询,但不太确定该怎么做。我想计算匹配的连续行数。例如

A A A B B B B A A

我希望结果是 3

A 的总数很容易计算,但我不确定是否只列出最近的 3 个。

这是我如何列出所有的示例

SELECT email,subject FROM tablename where email='test@example.com' 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

【问题讨论】:

  • 那么你想知道有多少A 行从第一行开始是连续的?
  • 是的。查询是找出连续发生的次数或连续备份失败。此示例显示连续 3 次失败。
  • 鉴于表中的行没有“顺序”(在传统意义上),我们如何知道哪个是第一,哪个是第二?
  • 好点。我可以按日期订购这个
  • 您应该展示一个更好的示例数据示例,以及您期望的输出结果。

标签: mysql count


【解决方案1】:

我在这里加载了一个 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

【讨论】:

  • 谢谢。看起来这就是我所追求的。稍后我将全面测试并确认解决方案:)
【解决方案2】:

您可以使用以下方式。我们所需要的只是计算值的变化,例如当前值不等于前一个值。在此示例中,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 demo

如果您只需要计算超过 1 个值的序列,则可以使用以下语句。这里HAVING count(*)&gt;1 意味着我们只需要来自行中2个或更多值的序列。如果您需要 3 个或更多,请将其更改为 HAVING count(*)&gt;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 demo

【讨论】:

  • 我认为这行不通 - 请参阅sqlfiddle.com/#!2/973a1/1:我更改了表格值,但答案仍然是 3
  • @AgRizzo 我又添加了一个查询来查找超过 1 个值的序列。谢谢
  • 这是不正确的。您实际计算的不是具有相同值的连续行的数量,而是不连续的数量 - 即一行的值与前一行的值不同的次数。 'ABABA' 应该产生 1 的输出,但您的脚本将输出 5。一个非常聪明的解决方案...解决不同的问题。
【解决方案3】:

这只是一个简单的技巧,如果你找到第一个非失败数据 id,你可以轻松计算连续通过。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    • 2010-09-24
    • 2014-04-21
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多