我有一张这样的桌子;
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
我已经陷入了这一点,提前谢谢。
答案 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)
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;