Oracle:获取较小的值和第一个更大的值

时间:2017-07-11 09:48:47

标签: sql oracle

我有一张这样的桌子;

ID     Name     Value
1      Sample1     10
2      Sample2     20
3      Sample3     30
4      Sample4     40

我希望获得包含较小值的所有行以及包含更大值的第一行。

例如,当我发送' 25'作为Value列的参数,我想要有下表;

ID     Name     Value
1      Sample1     10
2      Sample2     20
3      Sample3     30

我已经陷入了这一点,提前谢谢。

3 个答案:

答案 0 :(得分:3)

救援的分析功能!

create table your_table (
id     number,
value  number)

insert into your_table
select level, level * 10
from dual
connect by level <= 5

select * from your_table

id  | value
----+------
1   | 10
2   | 20
3   | 30
4   | 40
5   | 50

好的,现在我们使用lag()。指定字段,偏移量和默认值(对于没有前一行的第一行)。

select id, value, lag(value, 1, value) over (order by value)  previous_value
from   your_table

id | value | previous_value 
---+-------+---------------
1  |  10   |    10
2  |  20   |    10
3  |  30   |    20
4  |  40   |    30
5  |  50   |    40

现在应用where

select id, value
from (
  select id, value, lag(value, 1, value) over (order by value)  previous_value
  from   your_table)
where   previous_value < 25

适合我。

id  | value
----+------
1   | 10
2   | 20
3   | 30

当然,你必须对关系有一些政策。例如,如果两行具有相同的值并且它们都是第一行会发生什么 - 您是要保留两者还是仅保留其中一行。或者你可能有其他一些打破平局的标准(比如按ID排序)。但这个想法很简单。

答案 1 :(得分:0)

您可以尝试这样的查询:

 SELECT * FROM YourTableName WHERE Value < 25 OR ID IN (SELECT TOP 1 ID FROM YourTableName WHERE Value >= 25 ORDER BY Value)

答案 2 :(得分:0)

在Oracle中,您可以试试这个(但请看“那个年轻人”的答案,我认为这比我的好):

  SELECT * FROM (
    SELECT ID, NAME, VALUE, 1 AS RN 
    FROM YT 
    WHERE VALUE < 25
    UNION ALL    
    SELECT ID, NAME, VALUE, ROW_NUMBER()OVER (ORDER BY VALUE) AS RN 
    FROM YT 
    WHERE VALUE > 25
    ) A
    WHERE RN=1;