赞
踩
最近查询的时候,经常要用到一个区间段中的第一条数据,根据我自己的了解和网上的总结,下面来跟大家分享一下,不足之处还请指正:
一、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天的净值进行取总值、取最大值、取最小值,取平均值
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。