如何使用mysql获取连续数字?

时间:2017-05-24 06:21:08

标签: mysql

我想检索连续数字及其计数,例如在我的数据库中我有输入

1,2,3,4,5,9,10,12,14,15,16,51,81

我预计输出

Numbers         counts
  1-5              5
  9-10             2
 12-16             4
   51              1
   81              1

如果有人知道,请分享解决方案....

2 个答案:

答案 0 :(得分:3)

免责声明:这是为了它的乐趣。使用您选择的实际编程语言可能更容易。

这并不像第一眼看上去那么容易,你必须使用user-defined variables

示例数据:

CREATE TABLE t
    (`id` int)
;

INSERT INTO t
    (`id`)
VALUES
    (1),
    (2),
    (3),
    (4),
    (5),
    (9),
    (10),
    (12),
    (14),
    (15),
    (16),
    (51),
    (81)
;

查询:

SELECT CONCAT_WS('-', MIN(id), IF(MAX(id) = MIN(ID), NULL, MAX(id))), COUNT(*)
FROM (
SELECT 
id
, @group_number := IF(@prev != id - 1, @group_number + 1, @group_number) AS gn
, @prev := id
FROM 
t,
(SELECT @group_number := 0, @prev := NULL) var_init_subquery
ORDER BY id
) sq
GROUP BY gn

结果:

| CONCAT_WS('-', MIN(id), IF(MAX(id) = MIN(ID), NULL, MAX(id))) | COUNT(*) |
|---------------------------------------------------------------|----------|
|                                                           1-5 |        5 |
|                                                          9-10 |        2 |
|                                                            12 |        1 |
|                                                         14-16 |        3 |
|                                                            51 |        1 |
|                                                            81 |        1 |

答案 1 :(得分:0)

+-----------------------+----------+
| cheque_no Ascending 1 | COUNT(*) |
+-----------------------+----------+
| 0                     |        1 |
| 69843-69867           |       25 |
| 69867-69919           |       53 |
| 69919-69922           |        4 |
| 69922-69923           |        2 |
| 69923-69924           |        2 |
| 69924-69925           |        2 |
| 69925-69926           |        2 |
| 69926-69929           |        4 |
| 69929-69930           |        2 |
| 69930-69931           |        2 |
| 69931-69932           |        2 |
| 69932-69936           |        5 |
| 69936-69937           |        2 |
| 69937-70000           |       64 |
| 74101-74106           |        6 |
| 74108-74148           |       41 |
+-----------------------+----------+

尽管阅读了免责声明,我还是可以这样做。现在只需要一个紧急选项