救援分析功能!
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排序)。但這個想法很簡單。
在你的例子中,如果你作爲參數傳入的值是20,結果應該是什麼?在你的問題陳述中,你提到「較小」和「較大」,但「平等」又如何?那麼:如果傳入值25,但ID = 4的行的值爲30,等於ID = 3,那該怎麼辦?你選擇兩行(總體來說,你選擇所有四行)?這些是關於需求的問題,而不是解決方案。在嘗試編寫代碼之前,他們必須有一個非常明確的答案。 – mathguy
您使用的是哪個版本的Oracle?如果它是Oracle 12.1或更高版本,則使用MATCH_RECOGNIZE的問題有一個非常高效的解決方案。如果你不知道你的版本,運行'select * from v $ version'。該版本是一個由12.1.0.2.0中的五部分組成的「編號」。 – mathguy
@mathguy感謝您的回覆。首先,如果行中有一個領帶,那麼我只需要其中的一個。其次,如果我發送20作爲參數,則查詢必須只返回前兩行。第三,我的Oracle版本是舊的:)其實10g(10.2.0.4.0) –