选择不超过特定值的行

时间:2018-08-19 09:18:18

标签: sql oracle select

有没有一种方法可以从第一行中选择符合条件的特定行?

示例:

Date        Val or Val
1-1-2018    2      s 
1-2-2018    3      q 
1-3-2018    4      l 
1-4-2018   -2      a 
1-5-2018   -4      a 
1-6-2018   -6      c

我只需要选择第一个否定词

value: 2 3 4 -2

或直到第一个 a :s q l a

注意。我尽可能不使用子查询。如果可能的话

1 个答案:

答案 0 :(得分:3)

您几乎需要一个子查询。

我倾向于这样做:

select t.*
from t
where t.date <= (select min(t2.date)
                 from t t2
                 where t2.val1 < 0 or t2.val3 = 'a'
                );

您还可以使用窗口功能:

select t.*
from (select t.*,
             min(case when val1 < 0 or val2 = 'a' then date end) over (order by date) as cutoff_date
      from t
     ) t
where date <= cutoff_date;

我应该小心。在Oracle 12C中,您可以在没有子查询的情况下执行此操作:

select t.*
from t
order by coalesce(sum(case when val1 < 0 or val2 = 'a' then 1 else 0 end) over (order by date rows between unbounded preceding and 1 preceding), 0)
fetch first 1 row only with ties;

但是这种方法有点深刻。