PL / SQL如何选择n-1值?

时间:2014-02-15 12:56:31

标签: oracle plsql

declare 
    hour_in number:=4;
    minute_in number:=59;
    sek_in number:=45;
    together_in number;
    sat varchar(10):='G6';
    M0 number;
begin
    kopa_in:=((sek_in/60)+minute_in)/60+hour_in;

    select M0 into M0 
    from jsm_nav 
    where ((sekunde/60)+minute)/60+stunda<together_in 
    and prn=sat;

    select delta_n into deltan 
    from jsm_nav 
    where ((sekunde/60)+minute)/60+stunda<together_in 
    and prn=sat;
end;

仅当只有一个低于together_in的值时才有效!如果我们假设n-1together_in值,我需要选择n值! 谢谢!

3 个答案:

答案 0 :(得分:1)

你想要“n - 1”值是什么意思?你只能把一个变成一个变量。

在不更改查询的情况下获取一个值的简单方法是使用min()max()

select min(M0) into M0 from jsm_nav where ((sekunde/60)+minute)/60+stunda<together_in and prn=sat;
select min(delta_n) into deltan from jsm_nav where ((sekunde/60)+minute)/60+stunda<together_in and prn=sat;

当然,您不需要两个查询来执行此操作:

select min(M0),min(delta_n) into M0, jsm_nav
from jsm_na
where ((sekunde/60)+minute)/60+stunda<together_in and prn=sat;

答案 1 :(得分:0)

将此添加到给定的查询

and rownum < together_in;

确保together_in初始化良好

答案 2 :(得分:0)

SELECT INTO只需要一行。您应该限制查询返回的行数。

执行此操作的一种方法是使用ROWNUM

select M0 into M0 from (select M0 from jsm_nav where ((sekunde/60)+minute)/60+stunda<together_in and prn=sat order by ((sekunde/60)+minute)/60+stunda desc) where rownum = 1;
select delta_n into deltan from (select delta_n from jsm_nav where ((sekunde/60)+minute)/60+stunda<together_in and prn=sat order by ((sekunde/60)+minute)/60+stunda desc) where rownum = 1;

我使用了ROWNUMORDER BY ... DESC的组合,以便您只获得一行(最接近together_in的行)。