2017-02-10 117 views
1

我很想知道如何在Oracle中基於返回行列表中的上一行編寫SQL查詢。基本上,我必須查詢我們的數據庫中所有ID爲2460的行,但前一行(按日期排序)的ID號是2463.有沒有辦法做到這一點?Oracle SQL:根據先前行中的值進行選擇列

對不起,如果這是混亂或一個愚蠢的問題,我是非常新的,並不是很擅長這類事情。我很樂意澄清任何需要澄清的事情。

謝謝!

編輯:

下面是我根據戈登與我越來越VS我想要的結果,結果的截圖沿着答案運行查詢。

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 
; 

然後,我將找到位置#並查詢它的具體日期。

select * 
from activitytranledger 
where location = 5777 
and trandate between to_date('02/7/2017','MM/DD/YYYY') 
and to_date('02/8/2017','MM/DD/YYYY') 
order by trandate 
; 

使用「Transid」我可以找到第一個查詢輸出的特定行。但是,它似乎沒有給我想要的結果。

Wanted results(注意行直接與2460「Reasontype」行上面有着怎樣的理由類型2463)

Current results(我強調該行應該有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'函數,並且去掉一層嵌套的子查詢。 (但你是否可以做到這一點取決於查詢的作用。) – 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 
;