【问题标题】:Specify table for Row_Number() in Oracle SQL在 Oracle SQL 中为 Row_Number() 指定表
【发布时间】:2020-10-02 20:00:18
【问题描述】:

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

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

【问题讨论】:

  • 您的select 子句在哪里?

标签: sql oracle join select window-functions


【解决方案1】:

您的原始查询过于复杂。只需使用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 关系:因此原始表中的行可能会被复制或逐出,这会改变窗口函数操作的分区。加入外部查询可能更简单:

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 

【讨论】:

  • 出于我的目的,我查看了滞后函数,但是,我选择了联接,因为我想将前一行的 GBD_TO_DATE 和 STATUS 作为同一记录的附加列。此查询正在提供我正在 PowerBI 中构建的报告,对我来说,在同一行上进行与上一个的更改会更容易。我找不到滞后的方法,有没有办法做到这一点?谢谢!
  • @RuoxiGuo:您可以添加更多lag() 表达式。例如,lag(status) over(order by objectid, gdb_to_date desc) 为您提供之前的 status,依此类推。
  • 感谢您的提示!周一上班的时候我会试一试!我想我从根本上误解了 lag() 的工作原理。 (旁注,如果您收到垃圾邮件,我不知道为什么我无法正确地@您抱歉)
  • 嘿,我真的很想谢谢你!今天我终于有时间来切换这个查询,它工作得很好。这很容易理解,并且了解您如何构建它会很有帮助,因为我目前对 SQL 结构并没有很好的掌握。在发帖之前,我曾尝试实施其他几种方法来做到这一点,但我认为这绝对是我最喜欢的。谢谢! (我的@还是不行)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-16
  • 1970-01-01
  • 2013-09-28
  • 1970-01-01
  • 2011-02-26
  • 2022-07-07
  • 2016-11-17
相关资源
最近更新 更多