我的表有以下结构。
CREATE TABLE datatable
(
"DT_ID" NUMBER (10, 0),
"ASSIGNED" NUMBER (1, 0) DEFAULT 0,
"ASSIGNED_DATE_TIME" DATE,
"ASSIGNED_BY" VARCHAR2 (7 BYTE),
"ACCEPTED" NUMBER (1, 0) DEFAULT 0,
"ACCEPTED_DATE_TIME" DATE,
"ACCEPTED_BY" VARCHAR2 (7 BYTE),
"REJECTED" NUMBER (1, 0) DEFAULT 0,
"REJECTED_DATE_TIME" DATE,
"REJECTED_BY" VARCHAR2 (7 BYTE)
);
我需要根据日期找到最新的动作,并需要将它插入到一个新表中。
insert into newTable(ID, ACTION_USER, DATE) 值(DT_ID,这里我需要检查顺序 ACCEPTED_DATE_TIME,REJECTED_DATE_TIME,ASSIGNED_DATE_TIME 想找出最新的action和对应的owner(xxxxxx_BY)字段,对应的datetime asassigned_date_time)要插入..
例如,如果
REJECTED_DATE_TIME
具有最新日期,则 rejected_by 字段 = action_user 列值。
您可以使用
cross apply
取消透视,然后聚合结果集以检索每行的最新操作日期,同时 keep
ing 相应的用户。
insert into newtable (dt_id, action_user, action_date_time)
select d.dt_id,
max(x.action_user) keep(dense_rank last order by x.action_date_time),
max(x.action_date_time)
from datatable d
cross apply (
select d.assigned_date_time action_date_time, d.assigned_by action_user from dual
union all select d.accepted_date_time, d.accepted_by from dual
union all select d.rejected_date_time, d.rejected_by from dual
) x
group by d.dt_id
使用
GREATEST
和CASE
表达式:
INSERT INTO newTable(id, action_user, action_date)
SELECT DT_ID,
CASE GREATEST(assigned_date_time, accepted_date_time, rejected_date_time)
WHEN rejected_date_time
THEN rejected_by
WHEN accepted_date_time
THEN accepted_by
WHEN assigned_date_time
THEN assigned_by
END,
GREATEST(assigned_date_time, accepted_date_time, rejected_date_time)
FROM datatable;
其中,对于示例数据:
CREATE TABLE datatable
(
"DT_ID" NUMBER (10, 0),
"ASSIGNED" NUMBER (1, 0) DEFAULT 0,
"ASSIGNED_DATE_TIME" DATE,
"ASSIGNED_BY" VARCHAR2 (7 BYTE),
"ACCEPTED" NUMBER (1, 0) DEFAULT 0,
"ACCEPTED_DATE_TIME" DATE,
"ACCEPTED_BY" VARCHAR2 (7 BYTE),
"REJECTED" NUMBER (1, 0) DEFAULT 0,
"REJECTED_DATE_TIME" DATE,
"REJECTED_BY" VARCHAR2 (7 BYTE)
);
INSERT INTO dataTable
SELECT 1, 0, DATE '2023-01-01', 'Alice', 1, DATE '2023-02-01', 'Betty', 2, DATE '2023-03-01', 'Carol' FROM DUAL;
CREATE TABLE newTable(
id NUMBER(10,0),
action_user VARCHAR2(7 BYTE),
action_date DATE
);
然后,插入后,表格包含:
ID | ACTION_USER | 行动日期 |
---|---|---|
1 | 卡罗尔 | 2023-03-01 00:00:00 |