Select满足输入条件的第n行-Oracle数据库-Sqldbx
Select nth row from where the input condition is satisfied - Oracle database- Sqldbx
我对 Oracle 完全陌生。我有一个 table 存储了工作日。我想从满足输入条件的地方获得第 5 个工作日(第 5 行)。例如,请考虑以下 table
BUSINESS DAY
8/06/2004 12:00:00 AM
8/07/2004 12:00:00 AM
8/08/2004 12:00:00 AM
8/09/2004 12:00:00 AM
8/10/2004 12:00:00 AM
8/13/2004 12:00:00 AM
8/14/2004 12:00:00 AM
8/15/2004 12:00:00 AM
8/16/2004 12:00:00 AM
这里我的输入日期是 8/08/2004 12:00:00 AM 我的输出应该是 8/15/2004 12:00:00 AM。请帮助为此构建查询。请注意,根据要求,我可能还需要过去的日期。
我也提到了其他堆栈流问题和答案。但似乎 none 符合我的问题。
这里有一个选项:排序业务日期(使用 ROW_NUMBER
分析函数),然后对其应用简单的算术(即加 5 天,或减去一些天数):
SQL> with test (busday) as
2 (select date '2004-08-06' from dual union
3 select date '2004-08-07' from dual union
4 select date '2004-08-08' from dual union
5 select date '2004-08-09' from dual union
6 select date '2004-08-10' from dual union
7 select date '2004-08-13' from dual union
8 select date '2004-08-14' from dual union
9 select date '2004-08-15' from dual union
10 select date '2004-08-16' from dual
11 ),
12 inter as
13 (select busday, row_number() over (order by busday) rn
14 from test
15 )
16 select i.busday
17 from inter i
18 where i.rn = (select i1.rn + 5 from inter i1
19 where i1.busday = date '&par_busday'
20 );
Enter value for par_busday: 2004-08-08
BUSDAY
----------
2004-08-15
SQL>
演示 table:
create table business_days (busday) as
select date '2004-08-06' from dual union
select date '2004-08-07' from dual union
select date '2004-08-08' from dual union
select date '2004-08-09' from dual union
select date '2004-08-10' from dual union
select date '2004-08-13' from dual union
select date '2004-08-14' from dual union
select date '2004-08-15' from dual union
select date '2004-08-16' from dual;
一种方法:
select busday, t_plus_5
from ( select busday
, lead(busday,5) over (order by busday) as t_plus_5
from business_days
where busday >= date '2004-08-08' )
where busday = date '2004-08-08';
或者这个(需要 Oracle 12.1 或更高版本):
select busday
, ( select d5.busday from business_days d5
where d5.busday >= d1.busday
order by busday
offset 5 rows fetch first row only ) as t_plus_5
from business_days d1
where busday = date '2004-08-08';
我对 Oracle 完全陌生。我有一个 table 存储了工作日。我想从满足输入条件的地方获得第 5 个工作日(第 5 行)。例如,请考虑以下 table
BUSINESS DAY
8/06/2004 12:00:00 AM
8/07/2004 12:00:00 AM
8/08/2004 12:00:00 AM
8/09/2004 12:00:00 AM
8/10/2004 12:00:00 AM
8/13/2004 12:00:00 AM
8/14/2004 12:00:00 AM
8/15/2004 12:00:00 AM
8/16/2004 12:00:00 AM
这里我的输入日期是 8/08/2004 12:00:00 AM 我的输出应该是 8/15/2004 12:00:00 AM。请帮助为此构建查询。请注意,根据要求,我可能还需要过去的日期。
我也提到了其他堆栈流问题和答案。但似乎 none 符合我的问题。
这里有一个选项:排序业务日期(使用 ROW_NUMBER
分析函数),然后对其应用简单的算术(即加 5 天,或减去一些天数):
SQL> with test (busday) as
2 (select date '2004-08-06' from dual union
3 select date '2004-08-07' from dual union
4 select date '2004-08-08' from dual union
5 select date '2004-08-09' from dual union
6 select date '2004-08-10' from dual union
7 select date '2004-08-13' from dual union
8 select date '2004-08-14' from dual union
9 select date '2004-08-15' from dual union
10 select date '2004-08-16' from dual
11 ),
12 inter as
13 (select busday, row_number() over (order by busday) rn
14 from test
15 )
16 select i.busday
17 from inter i
18 where i.rn = (select i1.rn + 5 from inter i1
19 where i1.busday = date '&par_busday'
20 );
Enter value for par_busday: 2004-08-08
BUSDAY
----------
2004-08-15
SQL>
演示 table:
create table business_days (busday) as
select date '2004-08-06' from dual union
select date '2004-08-07' from dual union
select date '2004-08-08' from dual union
select date '2004-08-09' from dual union
select date '2004-08-10' from dual union
select date '2004-08-13' from dual union
select date '2004-08-14' from dual union
select date '2004-08-15' from dual union
select date '2004-08-16' from dual;
一种方法:
select busday, t_plus_5
from ( select busday
, lead(busday,5) over (order by busday) as t_plus_5
from business_days
where busday >= date '2004-08-08' )
where busday = date '2004-08-08';
或者这个(需要 Oracle 12.1 或更高版本):
select busday
, ( select d5.busday from business_days d5
where d5.busday >= d1.busday
order by busday
offset 5 rows fetch first row only ) as t_plus_5
from business_days d1
where busday = date '2004-08-08';