如何找到第一个"差距"在Informix`table中的自动增量列中。
例如:
我的表格mission
是这样的:
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。
答案 0 :(得分:1)
其他问题的选定答案只需要进行简单的修改即可使用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(在表格中出现的数字后丢失的第一个数字)。要在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);
测试:在Mac OS X 10.11.6上运行的Informix 12.10.FC5。