レスキュー機能に救済!
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
もちろん、ネクタイに関するポリシーが必要です。たとえば、2つの行が同じ値を持ち、両方が最初のものである場合はどうなりますか?両方を保持したいのか、どちらか一方のみを保持したいのですか?あるいは、あなたはタイを壊すための他の基準を持っているかもしれません(idでソート)。しかし、その考えはかなり単純です。
例では、引数として渡す値が20の場合の結果はどうなりますか?問題のステートメントでは、「より小さい」と「より大きい」と言いますが、「同等」はどうですか?次に、値25を渡すと、ID = 4の行の値は30、ID = 3になりますか?両方の行を選択しますか(全体的に4行すべてを選択します)?これは解決策ではなく要件に関する質問です。彼らはコードを書こうとする前に非常に明確な答えを持っていなければなりません。 – mathguy
どのOracleのバージョンを使用していますか? Oracle 12.1以降の場合、問題はMATCH_RECOGNIZEを使用すると非常に効率的なソリューションになります。バージョンがわからない場合は、 'select * from v $ version'を実行してください。バージョンは、12.1.0.2.0のように5つの部分で構成される「番号」です。 – mathguy
@mathguy返事をありがとう。まず、行に繋がりがある場合は、そのうちの1つのみが必要です。次に、パラメータとして20を送信すると、クエリは最初の2つの行のみを返す必要があります。そして第3に、私のOracleバージョンは古いものです:)実際に10g(10.2.0.4.0) –