[英]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.