2017-07-11 66 views
0

我有一個這樣的表;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 

我被困在這一點,在此先感謝。

+0

在你的例子中,如果你作爲參數傳入的值是20,結果應該是什麼?在你的問題陳述中,你提到「較小」和「較大」,但「平等」又如何?那麼:如果傳入值25,但ID = 4的行的值爲30,等於ID = 3,那該怎麼辦?你選擇兩行(總體來說,你選擇所有四行)?這些是關於需求的問題,而不是解決方案。在嘗試編寫代碼之前,他們必須有一個非常明確的答案。 – mathguy

+0

您使用的是哪個版本的Oracle?如果它是Oracle 12.1或更高版本,則使用MATCH_RECOGNIZE的問題有一個非常高效的解決方案。如果你不知道你的版本,運行'select * from v $ version'。該版本是一個由12.1.0.2.0中的五部分組成的「編號」。 – mathguy

+0

@mathguy感謝您的回覆。首先,如果行中有一個領帶,那麼我只需要其中的一個。其次,如果我發送20作爲參數,則查詢必須只返回前兩行。第三,我的Oracle版本是舊的:)其實10g(10.2.0.4.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排序)。但這個想法很簡單。

+0

比你@那個年輕人! **滯後()**功能做這項工作!如果有平局,我只需要一個價值,另一個不需要。 –

0

你可以嘗試這樣的查詢:

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

感謝您的回覆,這個例子向我展示瞭解決我的問題的方法! –

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; 
+0

謝謝你,我會在我的另一張桌子上嘗試這一個;) –

+0

@CemKahramanoğlu無論如何,如果你有很多記錄,請看看這兩個查詢(我的和YoungMan之一)的表演。兩者都有效,但我不確定哪一個最好。 – etsa

相關問題