我如何在 Informix table 的 运行 计数器中找到间隙

How do I find a gap in running counter in Informix table

如何在 Informix`table 的自动递增列中找到第一个 "gap"。

例如:

我的tablemission是这样的:

emp_num  serial_request  year_request
33         45            2012
667        46            2012
588        50            2012
78         53            2012
89         33            2013

我想要第一个空档 2012 ----> 47

我搜索并发现了以下问题:

How do I find a “gap” in running counter with SQL? 但答案不包括 Informix。

其他问题的选定答案只需要简单的修改即可与 Informix 一起使用。

例如 — other question 中给出的一种解决方案是:

SELECT  id + 1
FROM    mytable mo
WHERE   NOT EXISTS
        (
        SELECT  NULL
        FROM    mytable mi 
        WHERE   mi.id = mo.id + 1
        )
ORDER BY
        id
LIMIT 1

适用于您的模式的 Informix 等价物是:

SELECT LIMIT 1 serial_request + 1 AS id
  FROM mission AS m1
 WHERE NOT EXISTS
       (SELECT *
          FROM mission AS m2 
         WHERE m2.serial_request = m1.serial_request + 1
       )
 ORDER BY id

根据示例数据,它正确地生成了答案 34(table 中出现的数字之后缺少的第一个数字)。要获取 2012 年输入的行后缺少的第一个数字,您只需添加一个条件:

   AND m1.year_request = 2012

导致:

SELECT LIMIT 1 serial_request + 1 AS id
  FROM mission AS m1
 WHERE NOT EXISTS
       (SELECT *
          FROM mission AS m2 
         WHERE m2.serial_request = m1.serial_request + 1
       )
   AND m1.year_request = 2012
 ORDER BY id

这确实会根据要求产生答案 47

您还可以使用 OLAP 窗口函数解决方案(同样,基于另一个问题的 SQL):

SELECT LIMIT 1
       q.previd + 1
  FROM (SELECT serial_request,
               LAG(serial_request) OVER (ORDER BY serial_request) previd
          FROM mission
         WHERE year_request = 2012
       ) AS q
 WHERE q.previd <> q.serial_request - 1
 ORDER BY q.previd;

这也产生了 47。我们可以讨论代码中加号和减号的相对优点 1 以及它们应该放在哪里。


测试架构和数据

DROP TABLE IF EXISTS mission;

CREATE TEMP TABLE mission
(
    emp_num         INTEGER NOT NULL PRIMARY KEY,
    serial_request  SERIAL NOT NULL UNIQUE,
    year_request    SMALLINT NOT NULL
);

INSERT INTO mission(emp_num, serial_request, year_request) VALUES(33, 45, 2012);
INSERT INTO mission(emp_num, serial_request, year_request) VALUES(667, 46, 2012);
INSERT INTO mission(emp_num, serial_request, year_request) VALUES(588, 50, 2012);
INSERT INTO mission(emp_num, serial_request, year_request) VALUES(78, 53, 2012);
INSERT INTO mission(emp_num, serial_request, year_request) VALUES(89, 33, 2013);

测试:Informix 12.10.FC5 运行 Mac OS X 10.11.6.