oracle SQL返回基于列具有相同值的行

yqkkidmi  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(92)

我的原始数据如下所示,其中ID已订购
| ID| StateFrom| StateTo| MH_ID| OP_ID|
| --|--|--|--|--|
| 1 | 2 | 1 | 123 ||
| 2 | 1 | 3 || 456 |
| 3 | 3 | 1 || 456 |
| 4 | 1 | 2 |||
| 5 | 2 | 3 | 765 ||
| 6 | 1 | 2 | 234 ||
| 7 | 2 | 3 || 345 |
如果任何ID有空mh_idop_id,这表明用户已经删除了条目。这样,ID 4应该从数据库中删除。删除这一行后,这是我的新数据集:
| ID| StateFrom| StateTo| MH_ID| OP_ID|
| --|--|--|--|--|
| 1 | 2 | 1 | 123 ||
| 2 | 1 | 3 || 456 |
| 3 | 3 | 1 || 456 |
| 4 | 2 | 3 | 765 ||
| 5 | 1 | 2 | 234 ||
| 6 | 2 | 3 || 345 |
现在我尝试只选择具有连续statefrom和stateto的数据。对于这种情况,应该从我试图查询的整体数据中排除ID 4行,因为它认为不再有效,因为原始的statefrom值来自用户删除的条目。
我应该为这个需求写什么查询?提前感谢您

6rqinv9w

6rqinv9w1#

with d as
(
    select 1 ID,2 StateFrom,1 StateTo,123 MH_ID,null OP_ID
    union all select 2,1,3,null,456
    union all select 3,3,1,null,456
    union all select 4,2,3,765,null     
    union all select 5,1,2,234,null
    union all select 6,2,3,null,345
)
select *
from
(
    select *
          ,LAG(StateTo, 1,0) OVER (ORDER BY id) AS PrevStateTo
    from d
) ilv
where StateFrom=PrevStateTo or PrevStateTo=0

相关问题