gpt4 book ai didi

sql - 获取主键顺序中的下一个id

转载 作者:行者123 更新时间:2023-11-29 12:55:46 27 4
gpt4 key购买 nike

我想针对给定条件循环 ID:

    BEGIN
...LOOP
SELECT attr FROM emp INTO myAttr where id=givenID;
IF <condition> THEN
givenID = __successorID(givenID)__; -- dummy func. of getting next id in order
END IF;
END LOOP;
END;

$$ LANGUAGE plpgsql

如何根据 emp 表中的 id 顺序获取下一个 id 即如何获取虚拟 succesorID 函数功能?

例如:在 id:1,2,3,4 系列的情况下,succesor(3) 将是 4 等等。

我需要使用命令式迭代构造获取表中给定 id 的下一个 id 值。

编辑我想根据非索引列(这里是日期 the_date)值找到最小 PK 索引值。 pk 在增加,而日期也是单调的。

那么下面的完整解决方案是最优的,还是可以通过某种方式进行优化?:

CREATE OR REPLACE FUNCTION get_min_find_by_date (
the_date DATE
) RETURNS integer AS $$
DECLARE
mid_val INTEGER;
max_id INTEGER;
min_id INTEGER;
mid_id INTEGER;
act_date DATE;
BEGIN
min_id=1;
SELECT MAX (id) INTO max_id FROM invoices;
WHILE min_id <= max_id LOOP
mid_id = (min_id + max_id) >> 1;
SELECT actual_date FROM invoices INTO act_date WHERE id=mid_id;
IF act_date < the_date THEN
min_id = mid_id +1
ELSE IF act_date > the_date THEN
max_id = mid_id -1
ELSE
RETURN mid_id
END IF;
END LOOP;

RETURN -(min_id); -- date not found
END;
$$ LANGUAGE plpgsql

创建:

CREATE TABLE invoices (
id serial PRIMARY KEY,
issue_time timestamp NOT NULL
);

INSERT INTO invoices (id, issue_time)
VALUES
(1, '2017-05-09 00:01:01')
, (2, '2017-05-09 00:01:01')
, (3, '2017-05-09 00:01:01')
, (4, '2017-05-09 00:01:01')

, (5, '2017-05-09 00:02:02')
, (6, '2017-05-09 00:02:02')
, (7, '2017-05-09 00:02:02')

, (8, '2017-05-09 00:02:03')

, (9, '2017-05-09 00:03:03')
, (10,'2017-05-09 00:03:03')
, (11,'2017-05-09 00:03:03');

假设 timestamps 是非递减的,我想获得给定 timestamp 的最小/最大 id。我在这里使用存储过程是因为我想将其执行时间与使用 clock_timestamp(); 过程的其他实现进行比较。

我的程序是使用二分搜索获取最小值/最大值的最佳方法还是有更优的解决方案?

最佳答案

不确定我如何正确理解您的问题。

如果你有 givenID 并且基于此,你需要在主键列中获取下一个 id,那么这很简单:

select min(id) as next_id from table where id > givenID

关于sql - 获取主键顺序中的下一个id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43818624/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com