其他组的解析函数LAG
Analytic function LAG for other group
我有一个这样的查询。
select m.*, lag (kod) over (partition by drv order by rn) from m;
DRV 列只有 2 个可能的值。查询显然 returns 来自与当前行相同的 drv-group 的 "lagged" 值。
但是,我需要 select KOD 列的值,其最大可能 RN 小于当前行的 RN 并且 DRV 不同于当前行的 DRV。显然我可以写一个相关的子查询,但我正在寻找更有效的东西。
非常感谢任何建议。
编辑
如评论中所述,一些示例数据将使问题更清楚。
RN DRV KOD LAG(KOD)
1365 lf 115892 115786
1366 zon 1159 1158
1367 lf 115927 115892
1368 zon 116 1159
1369 zon 1160 116
1370 lf 116029 115927
1371 lf 116043 116029
这是上面给出的查询结果。我只对 DRV='lf' 的记录感兴趣。例如,对于 RN=1367,我们有 LAG(KOD)=115892,因为这是该组中的前一个记录。我不需要从同一 partition/group 中获取以前的记录,而是需要一个查询,该查询将 return 来自另一组的以前的记录 - 在 RN=1367 的情况下,它必须 return 1159。这是因为对于有问题的记录 DRV='lf' 所以我想在另一个分区中查找 KOD,即 DRV='zon' 并根据 RN 的顺序选择 LAG,这是 RN 的记录=1366。
因此,规则必须如下所示:
RN DRV KOD NEW_LAG(KOD)
1365 lf 115892 ?
1366 zon 1159 ?
1367 lf 115927 1159
1368 zon 116 ?
1369 zon 1160 ?
1370 lf 116029 1160
1371 lf 116043 1160
请注意,我对 DRV='zon' 的记录的结果不感兴趣,这就是我在此处打上问号的原因。
with dat as (
select 1365 RN , 'lf' DRV, 115892 KOD from dual union all
select 1366 RN , 'zon' DRV, 1159 KOD from dual union all
select 1367 RN , 'lf' DRV, 115927 KOD from dual union all
select 1368 RN , 'zon' DRV,116 KOD from dual union all
select 1369 RN , 'zon' DRV, 1160 KOD from dual union all
select 1370 RN , 'lf' DRV, 116029 KOD from dual union all
select 1371 RN , 'lf' DRV, 116043 KOD from dual),
dat2 as (
select
RN, DRV, KOD,
LAST_VALUE(case when DRV = 'zon' then KOD end IGNORE NULLS) over ( order by RN) as LAG_KOD_ZON,
lag(KOD) over (order by RN) as LAG_KOD
from dat
)
select
RN, DRV, KOD,
CASE WHEN DRV = 'lf' THEN LAG_KOD_ZON end as LAG_KOD
from dat2;
结果
RN DRV KOD LAG_KOD
---------- --- ---------- ----------
1365 lf 115892
1366 zon 1159
1367 lf 115927 1159
1368 zon 116
1369 zon 1160
1370 lf 116029 1160
1371 lf 116043 1160
我有一个这样的查询。
select m.*, lag (kod) over (partition by drv order by rn) from m;
DRV 列只有 2 个可能的值。查询显然 returns 来自与当前行相同的 drv-group 的 "lagged" 值。
但是,我需要 select KOD 列的值,其最大可能 RN 小于当前行的 RN 并且 DRV 不同于当前行的 DRV。显然我可以写一个相关的子查询,但我正在寻找更有效的东西。
非常感谢任何建议。
编辑
如评论中所述,一些示例数据将使问题更清楚。
RN DRV KOD LAG(KOD)
1365 lf 115892 115786
1366 zon 1159 1158
1367 lf 115927 115892
1368 zon 116 1159
1369 zon 1160 116
1370 lf 116029 115927
1371 lf 116043 116029
这是上面给出的查询结果。我只对 DRV='lf' 的记录感兴趣。例如,对于 RN=1367,我们有 LAG(KOD)=115892,因为这是该组中的前一个记录。我不需要从同一 partition/group 中获取以前的记录,而是需要一个查询,该查询将 return 来自另一组的以前的记录 - 在 RN=1367 的情况下,它必须 return 1159。这是因为对于有问题的记录 DRV='lf' 所以我想在另一个分区中查找 KOD,即 DRV='zon' 并根据 RN 的顺序选择 LAG,这是 RN 的记录=1366。 因此,规则必须如下所示:
RN DRV KOD NEW_LAG(KOD)
1365 lf 115892 ?
1366 zon 1159 ?
1367 lf 115927 1159
1368 zon 116 ?
1369 zon 1160 ?
1370 lf 116029 1160
1371 lf 116043 1160
请注意,我对 DRV='zon' 的记录的结果不感兴趣,这就是我在此处打上问号的原因。
with dat as (
select 1365 RN , 'lf' DRV, 115892 KOD from dual union all
select 1366 RN , 'zon' DRV, 1159 KOD from dual union all
select 1367 RN , 'lf' DRV, 115927 KOD from dual union all
select 1368 RN , 'zon' DRV,116 KOD from dual union all
select 1369 RN , 'zon' DRV, 1160 KOD from dual union all
select 1370 RN , 'lf' DRV, 116029 KOD from dual union all
select 1371 RN , 'lf' DRV, 116043 KOD from dual),
dat2 as (
select
RN, DRV, KOD,
LAST_VALUE(case when DRV = 'zon' then KOD end IGNORE NULLS) over ( order by RN) as LAG_KOD_ZON,
lag(KOD) over (order by RN) as LAG_KOD
from dat
)
select
RN, DRV, KOD,
CASE WHEN DRV = 'lf' THEN LAG_KOD_ZON end as LAG_KOD
from dat2;
结果
RN DRV KOD LAG_KOD
---------- --- ---------- ----------
1365 lf 115892
1366 zon 1159
1367 lf 115927 1159
1368 zon 116
1369 zon 1160
1370 lf 116029 1160
1371 lf 116043 1160