2017-02-10 19 views
1

返された行のリストの前の行に基づいてOracleにSQLクエリを記述することに興味があります。基本的に私は2460のID番号を持つすべての行をデータベースに照会する必要がありますが、前の行(日付順)はID#2463です。これを行う方法はありますか?Oracle SQL:前の行の列の値に基づいて選択する

申し訳ありませんこれは混乱しているか愚かな質問ですが、私は非常に新しいものであり、このようなことはあまりよくありません。私は明確にする必要があるものを明確にすることをうれしく思うでしょう。

ありがとうございます!

編集:

ここで私は私が望んだ結果対取得していた結果のスクリーンショットと一緒にゴードンの回答に基づいて実行しているクエリです。

select * 
from (select activitytranledger.*, lag(reasontype) over (order by trandate) as prev_reason from activitytranledger) activitytranledger 
where trandate between to_date('02/7/2017','MM/DD/YYYY') 
and to_date('02/8/2017','MM/DD/YYYY') 
and reasontype = 2460 
and prev_reason = 2463 
order by trandate 
; 

私は場所#をとり、それを特定の日に照会します。

"Transid"を使用すると、最初のクエリによって出力された特定の行を見つけることができます。しかし、それは私に望ましい結果を与えているようではありません。

Wanted results

Current results(2460年の「Reasontype」と直接行の上の行は、2463年の理由の種類を持っているかに注目してください)(私がハイライトされた行は、私が指摘してきた欄に2463を持っている必要があります)

編集2:これは、あなたの質問の一つの解釈である2463年と2460

+1

あなたの質問を編集し、サンプルデータと希望する結果を提供してください。 –

答えて

2

を切り替えます。 lag()とサブクエリを使用してください:

select t.* 
from (select t.*, lag(id) over (order by date) as prev_id 
     from t 
    ) t 
where id = 2463 and prev_id = 2460; 
+1

@AdamNeighbors - さらに説明するには、 'where'節で' lag()... 'を直接使うことができれば簡単でしょう。残念ながら、あなたはできません。サブクエリは避けられません。しかし、あなたの定式化では、テーブルから選択していません - あなたは "返された行のリスト"から選択しています。このリストがビルドされている場所では、 'lag'関数を追加してネストされたサブクエリの1つの層をなくすことができます。 (しかし、あなたがそれを行うことができるかどうかは、クエリが何をするかによって決まります。) – mathguy

+0

@ GordonLinoff私はそれを少し明確にするためにいくつかの編集を行いました。 –

0

だから、私はばかだと分かります。 @ GordonLinoffのソリューションは完璧に機能しました。以下のクエリに位置#を追加することを忘れてしまったのは、私が思い描いた最終的なクエリです。私は場所#を変数に置き換えることができ、それを私のループに挿入することができ、それは魅力のように機能します。貢献してくれてありがとう!

select * 
from (select activitytranledger.*, lag(reasontype) over (order by trandate) as 
prev_reason from activitytranledger) activitytranledger 
where trandate between to_date('02/7/2017','MM/DD/YYYY') 
and to_date('02/8/2017','MM/DD/YYYY') 
and location = 5777 
and reasontype = 2460 
and prev_reason = 2463 
order by trandate 
; 
関連する問題