我有一个名为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 5
和1
,因此最长的连胜数是2,3,5
如何在mysql中选择?
谢谢。
答案 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 |