mysql - 如何编写 SQL 查询以获取行中最长的大于零值的序列数?

标签 mysql sql

我有一个这样的表:

|  id   | prize |
-----------------
|   1   |   8   |
|   2   |   2   |
|   3   |   5   |
|   4   |   0   |
|   5   |   0   |
|   6   |   2   |
|   7   |   0   |
|   8   |   1   |
|   9   |   4   |

在这里你可以看到最长的正值序列是 3 (8,2,5)

我想得到这样的结果:

| result |
----------
|   3    |

我可以在 php 中检查它,但在一个 SQL 查询中完成它对我来说很重要。

编辑:我所说的正数是指大于零。

最佳答案

考虑这个解决方案:

select max(t.sequenceCnt)
from
(
    select t.cnt, count(*) sequenceCnt
    from
    (
        select d1.id, count(d2.id) cnt
        from data d1
        left join data d2 on d1.id < d2.id and d2.price = 0
        where d1.price != 0
        group by d1.id
    ) t
    group by t.cnt
) t

dbfiddle demo

这个解决方案的核心是最里面的子查询:

select d1.id, count(d2.id) cnt
from data d1
left join data d2 on d1.id < d2.id and d2.price = 0
where d1.price != 0
group by d1.id

其中连续的非零价格有 the same cnt 值。一旦你有了这个,剩下的就很容易了。您根据 cnt 分组,然后找到最大值。

关于mysql - 如何编写 SQL 查询以获取行中最长的大于零值的序列数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47915046/

相关文章:

Mysql Left join 旋转90°表

sql - 为什么 Oracle SQL 中的这个正则表达式会丢失字符串的开头?

mysql - 无法添加外键约束创建表 MySQL

sql - SQL Server如何从另一个数据库中选择一个表的数据?

mysql - 是否需要将 MySQL 用户添加到 MySQL "system"?

mysql - 禁用Doctrine 1.2中的自动Id字段生成

mysql - 查询以获取用户最近和最高的事件

php - 将一个表中的数据和一些硬代码插入到另一个表中

php - 查询将 'Array' 而不是值插入数据库

mysql - 选择两个没有连接的表mysql