我现在有两个表:
表a中的字段:ID,BJNO,Name,Datatime,type;
表b中的字段:ID,BJNO,Name,startdatatime,enddatatime,time_difference;
现在b表是空的,a表中有数据。
a表中的数据规则为: id唯一。bjno,name 对应,但是存在多条 bjno,name 相同的记录。type 只有两个值,一个是2,一个是5,5代表开始时间,2代表结束时间。
我现在的希望是,能够将这些记录,每一次的开始时间和结束时间对应起来。
a 表示例
ID BJNO name datatime type
1 Bj0001 1号报卷 2013-1-1 5
2 Bj0001 1号报卷 2013-1-2 2
3 Bj0002 2号报卷 2013-1-3 5
4 Bj0001 1号报卷 2013-1-4 5
5 Bj0002 2号报卷 2013-1-5 2
我希望可以 通过游标或其他oracle方式实现下面的内容:
当 type 是5的时候,把a表 BJNO,Name,Datatime 分别记录到 b表的BJNO,Name,startdatatime。
当 type 是2的时候,把a表 Datatime 记录到 先前 插入 到b 表中的记录(先前最后插入b表且bjno可以对应上的记录)中的 enddatatime 中。
结果 b 表示意
ID BJNO name startdatatime enddatatime time_difference
1 Bj0001 1号报卷 2013-1-1 2013-1-2 1
2 Bj0002 2号报卷 2013-1-3 2013-1-5 2
3 Bj0001 1号报卷 2013-1-4 当天减去 2013-1-4
游标我不是太懂,求高人指教
该回答引用ChatGPT
可以使用游标和PL/SQL语句实现这个功能。以下是一个可能的实现方法:
DECLARE
CURSOR cur_a IS
SELECT * FROM a ORDER BY BJNO, Name, Datatime, type;
v_startdatatime a.datatime%TYPE;
v_enddatatime a.datatime%TYPE;
BEGIN
FOR rec_a IN cur_a LOOP
IF rec_a.type = 5 THEN
-- 新开始时间记录到b表
INSERT INTO b (ID, BJNO, Name, startdatatime)
VALUES (b_seq.NEXTVAL, rec_a.BJNO, rec_a.Name, rec_a.Datatime);
v_startdatatime := rec_a.Datatime;
ELSE
-- 找到最近一次的开始时间并更新enddatatime
SELECT startdatatime INTO v_startdatatime
FROM (
SELECT *
FROM b
WHERE BJNO = rec_a.BJNO AND Name = rec_a.Name AND startdatatime <= rec_a.Datatime
ORDER BY startdatatime DESC
)
WHERE ROWNUM = 1;
UPDATE b
SET enddatatime = rec_a.Datatime, time_difference = rec_a.Datatime - v_startdatatime
WHERE BJNO = rec_a.BJNO AND Name = rec_a.Name AND startdatatime = v_startdatatime;
END IF;
END LOOP;
END;
这段PL/SQL代码首先声明一个游标cur_a,按BJNO、Name、Datatime和type升序排列a表中的记录。然后,遍历游标中的每条记录,如果type是5,则在b表中插入一条新记录,如果type是2,则在b表中找到最近一次的开始时间,并将当前记录的Datatime更新为enddatatime,并计算time_difference。最后,更新b表中的记录。注意,这里使用了序列b_seq,用于为插入的b表记录生成唯一的ID。