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 |
+-------+------+