如何在mysql中选择最长连续正条纹行?

时间:2019-09-11 11:33:16

标签: mysql sql laravel rdms

我有一个名为rev的表。它只有两列。 id和revNumber。

这是我的mysql小提琴http://sqlfiddle.com/#!9/86586e/1/0

id  revNumber
1     2
2     3
3     5
4    -3
5     1
6    -4 

这里连续的正数是2,3 and 51,因此最长的连胜数是2,3,5 如何在mysql中选择?

谢谢。

1 个答案:

答案 0 :(得分:2)

如您所言,您可以升级到MySQL 8.0,这是一个使用窗口函数的解决方案。您可以计算累积和并将其与行号进行比较,以识别条纹。排序可用于识别最长的条纹,例如:

以下查询将为您提供一条唯一记录,该记录代表最长的正数条纹(记录数,id列表和修订号列表)。

SELECT 
    COUNT(*) cnt, 
    GROUP_CONCAT(id ORDER BY id) ids,
    GROUP_CONCAT(rev_number ORDER BY id) rev_numbers
FROM (
    SELECT
        id,
        rev_number,
        ROW_NUMBER() OVER(ORDER BY id) rn,
        rev_number > 0 is_pos,
        SUM(CASE WHEN rev_number > 0 THEN 1 ELSE 0 END) OVER(ORDER BY id) sm
    FROM mytable
) x
GROUP BY (rn - sm), is_pos
ORDER BY cnt DESC
LIMIT 1

demo on DB Fiddle 及其示例数据将返回:

| cnt | ids   | rev_numbers |
| --- | ----- | ----------- |
| 3   | 1,2,3 | 2,3,5       |