为oracle sql中的行\ u number()指定表

qij5mzcb  于 2021-08-09  发布在  Java
关注(0)|答案(1)|浏览(331)

我有以下查询,目前正在按预期工作。它将我的表连接到自己的表中,以便识别状态发生更改的记录。

from
    (select
            ROW_NUMBER() OVER(order by OBJECTID, GDB_TO_DATE DESC) as R_NUM,
            OBJECTID,
            STATUS, 
            GDB_TO_DATE
        from updm.pipes_h
    ) r1
    join
    (select
            ROW_NUMBER() OVER(order by OBJECTID, GDB_TO_DATE DESC) as R_NUM,
            OBJECTID,
            STATUS,
            GDB_TO_DATE
        from updm.pipes_h
    ) r2 on r1.R_NUM = r2.R_NUM+1
    where r1.objectid = r2.objectid
    and r1.status != r2.status;

但是,我正在尝试添加一个额外的连接,以获取另一个表中的更多信息。我想把这个连接放在我的r1表中,就像这样:

select *
from
    (select
            ROW_NUMBER() OVER(order by p.OBJECTID, p.GDB_TO_DATE DESC) as R_NUM,
            p.OBJECTID,
            p.STATUS, 
            p.GDB_TO_DATE,
            ps.PRESSURESYSTEMNAME
        from updm.pipes_h p
        join updm.pressuresystem ps ON p.PRESSURESYSTEM_GLOBALID = ps.globalid
    ) r1
    join ...

问题是,如果我这样做,查询将返回错误的结果。我不确定这里出了什么问题,尽管我怀疑是r1中的row\u number()函数。我尝试使用p.row\u number(),但这也不是正确的语法。有人能建议吗?我试着查找row\u number()的示例,但没有找到与join一起使用的示例。

u3r8eeie

u3r8eeie1#

你原来的查询是过于复杂的事情。只是使用 lag() (或 lead() ):

select * 
from (
    select
        objectid,
        status,
        gbd_to_date,
        lag(objectid) over(order by objectid, gdb_to_date desc) lag_objectid
    from updm.pipes_h
) p
where objectid <> lag_objectid

如果你想多带一张table,你必须小心;您的解释表明,当前表和新表之间没有1-1关系:因此原始表中的行很可能被复制或逐出,这会改变window函数运行时的分区。加入外部查询可能更简单:

select *  -- better enumerate the columns here than use "*"
from (
    select
        objectid,
        status,
        gbd_to_date,
        lag(objectid) over(order by objectid, gdb_to_date desc) lag_objectid,
        pressuresystem_globalid 
    from updm.pipes_h
) p
join updm.pressuresystem ps ON p.pressuresystem_globalid = ps.globalid
where objectid <> lag_objectid

相关问题