Mysql 查找连续记录的数量
如果我有一个文件名为Mysql 查找连续记录的数量,mysql,sql,Mysql,Sql,如果我有一个文件名为 filenames 1201 1202 1203 1205 1207 1208 1301 1302 1303 1304 1305 1306 我希望结果是 sequences grouped , count 12 3 12 1 12 2 13 6 或者类似的 否则,我只提取列并用python或其他什么东西来完成它?您可以
filenames
1201
1202
1203
1205
1207
1208
1301
1302
1303
1304
1305
1306
我希望结果是
sequences grouped , count
12 3
12 1
12 2
13 6
或者类似的
否则,我只提取列并用python或其他什么东西来完成它?您可以通过枚举行然后计算差异来完成。在MySQL中,枚举使用变量:
select min(filename) as first_filename, max(filename) as last_filename, count(*) as num
from (select t.*, @rn := @rn + 1 as rn
from table t cross join (select @rn := 0) vars
) t
group by (filename - rn);
注意,这种类型假设
filename
是一个数字——毕竟,对于其他类型来说,连续意味着什么?如果它是一个以字符串表示的整数,那么这仍然有效。您可以通过枚举行,然后取差来完成此操作。在MySQL中,枚举使用变量:
select min(filename) as first_filename, max(filename) as last_filename, count(*) as num
from (select t.*, @rn := @rn + 1 as rn
from table t cross join (select @rn := 0) vars
) t
group by (filename - rn);
注意,这种类型假设
filename
是一个数字——毕竟,对于其他类型来说,连续意味着什么?如果它是一个以字符串表示的整数,那么这仍然有效。您可以通过枚举行,然后取差来完成此操作。在MySQL中,枚举使用变量:
select min(filename) as first_filename, max(filename) as last_filename, count(*) as num
from (select t.*, @rn := @rn + 1 as rn
from table t cross join (select @rn := 0) vars
) t
group by (filename - rn);
注意,这种类型假设
filename
是一个数字——毕竟,对于其他类型来说,连续意味着什么?如果它是一个以字符串表示的整数,那么这仍然有效。您可以通过枚举行,然后取差来完成此操作。在MySQL中,枚举使用变量:
select min(filename) as first_filename, max(filename) as last_filename, count(*) as num
from (select t.*, @rn := @rn + 1 as rn
from table t cross join (select @rn := 0) vars
) t
group by (filename - rn);
注意,这种类型假设
filename
是一个数字——毕竟,对于其他类型来说,连续意味着什么?如果它是一个以字符串表示的整数,那么这仍然有效。如果记录的长度相同,您可以使用
LEFT(filenames, 2)
这将为您提供相应的前两个数字。然后使用
RIGHT(filenames, 1)
这将为您提供相应的最后一个数字。如果记录的长度与您可以使用的长度相同
LEFT(filenames, 2)
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table(id INT NOT NULL PRIMARY KEY);
INSERT INTO my_table VALUES
(1201),
(1202),
(1203),
(1205),
(1207),
(1208),
(1301),
(1302),
(1303),
(1304),
(1305),
(1306);
SELECT a.id start
, MIN(c.id) - a.id + 1 cnt
FROM my_table a
LEFT
JOIN my_table b
ON b.id + 1 = a.id
LEFT
JOIN my_table c
ON c.id >= a.id
LEFT
JOIN my_table d
ON d.id - 1 = c.id
WHERE b.id IS NULL
AND c.id IS NOT NULL
AND d.id IS NULL
GROUP
BY a.id;
+-------+------+
| start | cnt |
+-------+------+
| 1201 | 3 |
| 1205 | 1 |
| 1207 | 2 |
| 1301 | 6 |
+-------+------+
这将为您提供相应的前两个数字。然后使用
RIGHT(filenames, 1)
这将为您提供相应的最后一个数字。如果记录的长度与您可以使用的长度相同
LEFT(filenames, 2)
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table(id INT NOT NULL PRIMARY KEY);
INSERT INTO my_table VALUES
(1201),
(1202),
(1203),
(1205),
(1207),
(1208),
(1301),
(1302),
(1303),
(1304),
(1305),
(1306);
SELECT a.id start
, MIN(c.id) - a.id + 1 cnt
FROM my_table a
LEFT
JOIN my_table b
ON b.id + 1 = a.id
LEFT
JOIN my_table c
ON c.id >= a.id
LEFT
JOIN my_table d
ON d.id - 1 = c.id
WHERE b.id IS NULL
AND c.id IS NOT NULL
AND d.id IS NULL
GROUP
BY a.id;
+-------+------+
| start | cnt |
+-------+------+
| 1201 | 3 |
| 1205 | 1 |
| 1207 | 2 |
| 1301 | 6 |
+-------+------+
这将为您提供相应的前两个数字。然后使用
RIGHT(filenames, 1)
这将为您提供相应的最后一个数字。如果记录的长度与您可以使用的长度相同
LEFT(filenames, 2)
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table(id INT NOT NULL PRIMARY KEY);
INSERT INTO my_table VALUES
(1201),
(1202),
(1203),
(1205),
(1207),
(1208),
(1301),
(1302),
(1303),
(1304),
(1305),
(1306);
SELECT a.id start
, MIN(c.id) - a.id + 1 cnt
FROM my_table a
LEFT
JOIN my_table b
ON b.id + 1 = a.id
LEFT
JOIN my_table c
ON c.id >= a.id
LEFT
JOIN my_table d
ON d.id - 1 = c.id
WHERE b.id IS NULL
AND c.id IS NOT NULL
AND d.id IS NULL
GROUP
BY a.id;
+-------+------+
| start | cnt |
+-------+------+
| 1201 | 3 |
| 1205 | 1 |
| 1207 | 2 |
| 1301 | 6 |
+-------+------+
这将为您提供相应的前两个数字。然后使用
RIGHT(filenames, 1)
这将为您提供相应的最后一个数字。文件名是否总是有4个字符长?是否有12991300个字符?那么会发生什么呢?文件名总是4个字符长吗?会有12991300个吗?那么会发生什么呢?文件名总是4个字符长吗?会有12991300个吗?那么会发生什么呢?文件名总是4个字符长吗?会有12991300个吗?那么会发生什么呢?我的文件名是一个文本,被解析为一个带右键的数字(文件名,4),所以我不能对它使用强制转换int,也不能得到结果。我的文件名是xxxxxxx 1201:(您的问题指定文件名仅由整数组成。如果这是最后四个字符,则将此解决方案与
right(文件名,4)
一起使用。它应该可以正常工作。我的文件名是一个文本,被解析为带有right(文件名,4)的数字因此,我无法对其使用强制转换为int,也无法获得结果。我的文件名是xxxxxxx 1201:(您的问题指定文件名仅由整数组成。如果这是最后四个字符,则使用此解决方案,并使用right(文件名,4)
。它应该可以正常工作。我的文件名是一个文本,被解析为一个带右键的数字(文件名,4),因此我无法对其使用强制转换为int,也无法获得结果。我的文件名是xxxxxxx 1201:(您的问题指定文件名仅由整数组成。如果这是最后四个字符,请将此解决方案与右(文件名,4)
配合使用。它应该可以正常工作。我的文件名是一个文本,解析为右(文件名,4)的数字)因此,我无法对其使用强制转换为int,也无法获得结果。我的文件名是xxxxxxx 1201:(您的问题指定文件名仅由整数组成。如果这是最后四个字符,请将此解决方案与right(filename,4)
一起使用。它应该可以正常工作。
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table(id INT NOT NULL PRIMARY KEY);
INSERT INTO my_table VALUES
(1201),
(1202),
(1203),
(1205),
(1207),
(1208),
(1301),
(1302),
(1303),
(1304),
(1305),
(1306);
SELECT a.id start
, MIN(c.id) - a.id + 1 cnt
FROM my_table a
LEFT
JOIN my_table b
ON b.id + 1 = a.id
LEFT
JOIN my_table c
ON c.id >= a.id
LEFT
JOIN my_table d
ON d.id - 1 = c.id
WHERE b.id IS NULL
AND c.id IS NOT NULL
AND d.id IS NULL
GROUP
BY a.id;
+-------+------+
| start | cnt |
+-------+------+
| 1201 | 3 |
| 1205 | 1 |
| 1207 | 2 |
| 1301 | 6 |
+-------+------+