获取插入 postgres 的最低可用列号
getting lowest available column number for insert postgres
我有一个应用程序,我希望将服装组分配给一个货架号。衣架数量应尽可能少,并且经常更换组(回收衣物)。那么我如何在下面的 table 中找到尽可能低的 rack_number
?
clothing_groups
table
[ id: sequal, rack_number: smallint ]
目前我们正在检索所有 rack_numbers
的升序列表,遍历它们以找到第一个间隙,并将其用于插入下一个 clothing_groups
SELECT
rack_number
FROM
clothing_groups
ORDER BY
rack_number ASC;
这似乎充其量是次优的,我宁愿要么检索单行,要么最好在插入中执行子查询以找到第一个可用的 rack_number
INSERT INTO
clothing_groups (rack_number)
VALUES
SELECT first_available_rack_number FROM clothing_groups WHERE ...
但是我不知道这是否可能或如何实现。
rack_number 行的任意组合都可以有间隙。这意味着序列可能是 [1,2,3,4,5,6,8,12,14..., 231,432,500]
并且它会根据删除和插入动态变化。唯一可以保证的是,存在一个低于 999 的“缺失”数字。
一个选项使用相关子查询:
INSERT INTO clothing_groups (rack_number)
SELECT MIN(rack_number) + 1
FROM clothing_groups cg
WHERE NOT EXISTS (SELECT 1 FROM clothing_groups cg1 WHERE cg1.rack_number = cg.rack_number + 1)
您还可以使用 window 函数:
INSERT INTO clothing_groups (rack_number)
SELECT MIN(rack_number) + 1
FROM (
SELECT rack_number, LEAD(rack_number) OVER(ORDER BY rack_number) lead_rack_number
FROM clothing_groups
) cg
WHERE lead_rack_number IS DISTINCT FROM rack_number + 1
我有一个应用程序,我希望将服装组分配给一个货架号。衣架数量应尽可能少,并且经常更换组(回收衣物)。那么我如何在下面的 table 中找到尽可能低的 rack_number
?
clothing_groups
table
[ id: sequal, rack_number: smallint ]
目前我们正在检索所有 rack_numbers
的升序列表,遍历它们以找到第一个间隙,并将其用于插入下一个 clothing_groups
SELECT
rack_number
FROM
clothing_groups
ORDER BY
rack_number ASC;
这似乎充其量是次优的,我宁愿要么检索单行,要么最好在插入中执行子查询以找到第一个可用的 rack_number
INSERT INTO
clothing_groups (rack_number)
VALUES
SELECT first_available_rack_number FROM clothing_groups WHERE ...
但是我不知道这是否可能或如何实现。
rack_number 行的任意组合都可以有间隙。这意味着序列可能是 [1,2,3,4,5,6,8,12,14..., 231,432,500]
并且它会根据删除和插入动态变化。唯一可以保证的是,存在一个低于 999 的“缺失”数字。
一个选项使用相关子查询:
INSERT INTO clothing_groups (rack_number)
SELECT MIN(rack_number) + 1
FROM clothing_groups cg
WHERE NOT EXISTS (SELECT 1 FROM clothing_groups cg1 WHERE cg1.rack_number = cg.rack_number + 1)
您还可以使用 window 函数:
INSERT INTO clothing_groups (rack_number)
SELECT MIN(rack_number) + 1
FROM (
SELECT rack_number, LEAD(rack_number) OVER(ORDER BY rack_number) lead_rack_number
FROM clothing_groups
) cg
WHERE lead_rack_number IS DISTINCT FROM rack_number + 1