最近查询的时候,经常要用到一个区间段中的第一条数据,根据我自己的了解和网上的总结,下面来跟大家分享一下,不足之处还请指正:

一、rownum的原理:

1、对于基表,是按照时间顺序的。在insert插入表时,oracle就按照insert的顺序,将rownum分配给每一行记录,比如这个表的第一行数据插入的时候rownum就是1。因此在select一个基表的时候,rownum的排序是根据insert记录的顺序显示的,

2、如果基表中,删除其中一条数据,则rownum会根据插入表格的时间动态改变各行rownum的值,如将原来rownum为2(即effectivedate  = 20161108)的数据删除,重新查询的时候,原来rownum为3(effectivedate  = 20161107)的数据rownum就变为2了;

       是因为在每一次select查询的时候,根据基表的默认insert顺序由oracle动态分配的,并不是一开始就写死的,是查询的时候才会有值,不查询的时候相当于没有值的

 

3、对于子查询,则rownum的顺序是根据子查询的查询顺序进行动态分配的;

如下图:

r1是根据数据插入表的时间来分配的,如图可以看出,20200619的数据比20200703的数据还要插入的晚
rownum 是通过查询里面排列的数据来分配的,例如按照日期从最近到最远,可以看到最近的日期为20200703

二、实际使用的一些例子

1、查询表格中现存的插入时间最早的数据,即rownum = 1;

2、查询表格中现存的插入时间最早的前5数据,即rownum  <=  5;

 

3、查询表格中现存的插入时间排第3数据,即rownum  =  3的数据;

   我们一开始这样子写sql:select rownum,e.* from etf_overseas_daily_param e where rownum = 3;

   查询之后发现是空的,为什么呢?

   因为在每一次select查询的时候,根据基表的默认insert顺序由oracle动态分配的,有1才有2,有2才有3,如果rownum没有1和2,那么3也就没有了意义,所以这个查询就不会有任何结果出来,如果要实现这个,就必须用子查询,先将rownum查询出来

 

 先将前5的查询来,再查第3条

4、对取出的前几名数据进行综合计算,比如取平均值、取最大值、取最小值、加减计算,如对前4天的净值进行取总值、取最大值、取最小值,取平均值

 

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐