使用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的新手,所以提示也会受到赞赏。有什么建议吗?
答案 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
的最大人口数。