SQL> with temp as
2 (select ename,
3 hiredate,
4 rank() over (order by hiredate desc) rn
5 from emp
6 )
7 select a.hiredate - b.hiredate as diff
8 from temp a cross join temp b
9 where a.rn = 1
10 and b.rn = 2;
DIFF
----------
34
SQL>
在您的情况下:
with temp as
(select insert_time,
row_number() over (order by insert_time desc) rn
from your_table
)
select a.insert_time - b.insert_time
from your_table a cross join your_table b
where a.rn = 1
and b.rn = 2;
SQL> create or replace trigger trg_bi_emp
2 before insert on emp
3 for each row
4 begin
5 update latest_diff set
6 last_insert = new_insert,
7 new_insert = :new.hiredate;
8 end;
9 /
Trigger created.
1条答案
按热度按时间kuarbcqp1#
这个例子是基于Scott的模式样本的,它的表当然没有 * 巨大数量的事务 *,但是这应该足以说明该方法。(所有日期都是
DD.MM.YYYY
)。这两个日期之间的差值为(天数)
Query * 使用
rank
分析函数,按hiredate
降序对 * 行进行排序,即rn = 1
代表"新插入的记录",rn = 2
代表"最后插入的记录",然后相减得到结果:在您的情况下:
它将受益于
insert_time
上的索引或者,如果您创建一个只包含这两个日期的新表,也许您可以 * 显著地 * 改进整个过程:
插入初始记录(以便您有一个 * 起点 *):
然后,在你的表上创建一个简单的触发器(在我的例子中是
emp
)来设置日期值,这个触发器应该很快就能完成它的工作:好吧,我们试试看:初始数据显示了我们已经计算的差异(34天):
正在向表中插入新记录:
latest_diff
表已修改(触发器已执行此操作):查找差异非常简单和快速,因为您不必每次都"滚动"这个"巨大"的表,而是从单行表中获取数据。