我对基于返回行列表中的前一行在 Oracle 中编写 SQL 查询感到好奇。基本上我必须在我们的数据库中查询 ID # 为 2460 的所有行,但前一行(按日期排序)的 ID # 为 2463。有什么办法可以做到这一点?
抱歉,如果这是一个令人困惑或愚蠢的问题,我是个新手,不太擅长这类事情。我很乐意澄清任何需要澄清的事情。
谢谢!
编辑:
这是我根据 Gordon 的回答运行的查询,以及我得到的结果与我想要的结果的屏幕截图。
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 (请注意“Reasontype”为 2460 的行正上方的行的原因类型为 2463)
Current results (我突出显示的行应该在我指向的列中有 2463)
编辑 2:切换 2463 和 2460
最佳答案
这是对您的问题的一种解释。使用 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;
关于sql - 甲骨文 SQL : Selecting based on value in previous rows columns,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42167637/