找到连续记录的数量

时间:2014-07-31 14:21:05

标签: 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中做某事?

3 个答案:

答案 0 :(得分:3)

您可以通过枚举行然后获取差异来实现此目的。在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是一个数字 - 毕竟,连续对其他类型意味着什么?如果它是一个表示为字符串的整数,那么这仍然有效。

答案 1 :(得分:0)

如果记录的长度相同,则可以使用

LEFT(filenames, 2)

这将为您提供相应的前两个数字。然后使用

RIGHT(filenames, 1)

这将给出相应的最后一个数字。

答案 2 :(得分:0)

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