我如何在 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.
如何在 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.