正确的中间值,以确保表格中需要日期和数字的顺序(数字是唯一的)

correct intermediate values to ensure order in table where is needed a date and number correlative order (number is unique)

提问人:Speaker 提问时间:10/31/2023 最后编辑:Ken WhiteSpeaker 更新时间:10/31/2023 访问量:23

问:

我有一个具有这种结构的表:

CREATE TABLE IF NOT EXISTS items
(
    item_number integer NOT NULL DEFAULT nextval('items_nro_seq'::regclass),
    item_date date,
    CONSTRAINT items_pk PRIMARY KEY (item_number)
);

逻辑约束:

  • item_number是独特且相关的。
  • 在某种item_date中,item_number可以有很多值
  • 对于高于 item_number Y 的 item_number,在X.item_date < Y.item_date时是一个错误(但可能存在)。

示例数据:

item_number item_date
1856 2023-10-21
1855 2023-10-21
1854 2023-10-22
1853 2023-10-22
1852 2023-10-21
1851 2023-10-21
1850 2023-10-21

我需要一个解决方案来识别样本数据中 item_number、1853 和 1854 的item_date并将其更改为“2023-10-21”。

item_number item_date
1856 2023-10-21
1855 2023-10-21
1854 2023-10-21
1853 2023-10-21
1852 2023-10-21
1851 2023-10-21
1850 2023-10-21

我尝试过使用row_number和滞后功能。我尝试使用子查询进行查询。我尝试定义函数并迭代。 我得到的最佳结果是将 item_number 1855 和 1856 的值更改为“2023-10-22”。这不是一个解决方案。

CREATE OR REPLACE FUNCTION correct_dates() RETURNS VOID AS $$
DECLARE
    item record;
    actual_date date;
BEGIN
    FOR item IN
        SELECT item_number, item_date
        FROM items
        ORDER BY nro, fecha
    LOOP
        IF item.item_date < actual_date THEN
            UPDATE items
            SET item_date = actual_date
            WHERE item_number = item.item_number AND item_date = item.item_date;
        ELSE
            actual_date := item.item_date;
        END IF;
    END LOOP;
END;
$$ LANGUAGE plpgsql;

谁能帮我弄清楚?

SQL PostgreSQL 函数

评论

2赞 Adrian Klaver 10/31/2023
1) 这不能保证提供相对于行中其他值的无间隙或严格有序的 s 集。2)这是一个脆弱的系统,它依赖于SQL中无法保证的东西,即排序。你真的重新思考你想要实现的目标。3)底线:一个依赖于你定期纠正的过程,它很可能是错误的。item_number integer NOT NULL DEFAULT nextval('items_nro_seq'::regclass)item_number
0赞 MatBailie 10/31/2023
序列值、恒等属性值只能用于唯一性。依赖排序,尤其是连续性,是一种代码气味(在所有情况下都不能保证滥用行为)。
0赞 Speaker 11/1/2023
两者都是严谨的,没什么好说的。Item_number是独一无二的,是有序的。以此为保证。有没有办法实现我需要的?也许我忘记了一些功能,比如滞后?

答: 暂无答案