修正PostgreSQL表中item_number与item_date的顺序异常问题
PostgreSQL日期异常修正问题
表结构
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 X大于Y,但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、lag函数、子查询,还定义了迭代函数,但得到的结果不符合需求——把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;
恳请帮忙解决这个问题。
内容的提问来源于stack exchange,提问作者Speaker
相关产品推荐
相关产品推荐

