MySQL:根据值查找表中的最大连续行

时间:2015-10-29 19:14:01

标签: mysql

使用MySQL,我试图根据值在表中找到最大数量的连续行。为简单起见,我的表格如下:

+----+-------+
| ID | VALUE |
+----+-------+
|  1 | A     |
|  2 | B     |
|  3 | A     |
|  4 | A     |
|  5 | B     |
|  6 | B     |
|  7 | A     |
|  8 | A     |
|  9 | A     |
| 10 | B     |
+----+-------+

在这个例子中,如果我想要'A'的连续行数最多,我会得到3.对于'B',我会得到2.甚至返回'A'的连续行数的结果集'会更好。我是SQL的新手,所以提示也会受到赞赏。有什么建议吗?

1 个答案:

答案 0 :(得分:4)

您可以使用变量:

SELECT VALUE, MAX(cnt) AS maxCount
FROM (
  SELECT VALUE, COUNT(grp) AS cnt
  FROM (
    SELECT ID, VALUE, rn - rnByVal AS grp
    FROM (
      SELECT ID, VALUE,
           @rn := @rn + 1 AS rn,
           @rnByVal := IF (@val = VALUE,
                          IF (@val := VALUE, @rnByVal + 1, @rnByVal + 1),
                          IF (@val := VALUE, 1, 1)) AS rnByVal
      FROM mytable
      CROSS JOIN (SELECT @rn := 0, @rnByVal := 0, @val := '') AS vars
      ORDER BY ID) AS t 
    ) AS s
  GROUP BY VALUE, grp ) AS u
GROUP BY VALUE  

变量@rn@rnByVal用于模拟ROW_NUMBER窗口函数,目前在MySQL中不可用。第二个变量(@rnByVal)执行VALUE 分区的计数。

在外部查询中使用@rn - @rnByVal,我们可以计算grp字段,该字段标识具有相同VALUE的连续行的字段。在GROUP BY上执行VALUE, grp我们可以计算这些岛屿的数量,最后,在最外层的查询中,获得每VALUE的最大人口数。

Demo here