其他组的解析函数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' 的记录的结果不感兴趣,这就是我在此处打上问号的原因。

LAST_VALUE IGNORE NULL 为您代劳

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