在 oracle 脚本中从一行中查找最新的 rcord

问题描述 投票:0回答:2

我的表有以下结构。

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 列值。

sql oracle sql-insert
2个回答
0
投票

您可以使用

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

0
投票

使用

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

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.