在有序嵌套子查询中访问父标识符
Accesing parent identifier in an ordered nested subquery
我需要一个查询来获取一个项目的值以及上一个项目的值(如果存在)。
我正在使用以下查询(实际的简化):
select v1.value item_value,
nvl(
(
select * from (
select v2.value
from ITEMS v2
where v2.insert_date<v1.insert_date
order by v2.insert_date desc
) where rownum=1
), 0
) as previous_value
from ITEMS v1
where v1.item_id=1234
此查询将不起作用 (ORA-00904),因为我在具有两层嵌套的内部 select 中使用 v1.insert_date
。
如何使用 Oracle 11 实现此目的?
我想你可以用解析函数 LAG 来实现这个。有关解析函数的更多信息 LAG LEAD
我创建了一个示例查询:
with items as (
select 1 as value, sysdate as insert_date from dual
union all
select 2 as value, sysdate-1 as insert_date from dual
union all
select 3 as value, sysdate+1 as insert_date from dual
)
select v1.value item_value,
lag(v1.value,1,0) over (order by v1.insert_date desc) as previous_value,insert_date
from ITEMS v1
order by insert_date desc
我需要一个查询来获取一个项目的值以及上一个项目的值(如果存在)。
我正在使用以下查询(实际的简化):
select v1.value item_value,
nvl(
(
select * from (
select v2.value
from ITEMS v2
where v2.insert_date<v1.insert_date
order by v2.insert_date desc
) where rownum=1
), 0
) as previous_value
from ITEMS v1
where v1.item_id=1234
此查询将不起作用 (ORA-00904),因为我在具有两层嵌套的内部 select 中使用 v1.insert_date
。
如何使用 Oracle 11 实现此目的?
我想你可以用解析函数 LAG 来实现这个。有关解析函数的更多信息 LAG LEAD
我创建了一个示例查询:
with items as (
select 1 as value, sysdate as insert_date from dual
union all
select 2 as value, sysdate-1 as insert_date from dual
union all
select 3 as value, sysdate+1 as insert_date from dual
)
select v1.value item_value,
lag(v1.value,1,0) over (order by v1.insert_date desc) as previous_value,insert_date
from ITEMS v1
order by insert_date desc