繁体   English   中英

在 Oracle SQL 中为 Row_Number() 指定表

[英]Specify table for Row_Number() in Oracle SQL

我有以下查询,目前正在按预期工作。 它将我的表连接到自身上,以识别状态发生变化的记录。

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_NUMBER() function。 我尝试使用 p.ROW_NUMBER() 但这也不是正确的语法。 任何人都可以建议吗? 我尝试查找 ROW_NUMBER() 的示例,但没有找到与联接一起使用的示例。

您的原始查询过于复杂。 只需使用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 

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

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 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM