2015-11-04 61 views
0

你好,我有一个lead的问题,并从下一组中检索下一个值。Oracle由组导致

我有这个表:

表A

----------------- 
    ID | value 
----------------- 
    1  | 2.5  
    1  | 1  
    1  | 4.5  
    2  | 7  
    2  | 2 
    3  | 3 
    4  | 1 
    4  | 7 

预期结果:

------------------------------ 
    ID | value | lead_id 
------------------------------ 
    1  | 2.5 | 2 
    1  | 1  | 2 
    1  | 4.5 | 2 
    2  | 7  | 3 
    2  | 2  | 3 
    3  | 3  | 4 
    4  | 1  | NULL 
    4  | 7  | NULL 

我的SQL:

select ID, value, lead(id) OVER (order by id) lead_id from TableA 

是否有可能得到这一结果?

+0

我们看到您的预期结果。但是,我们没有看到您的实际结果。你得到的错误结果是什么? – nop77svk

+0

我认为你得到lead_ID-1是你期望在前两行得到lead_ID-2,这是因为lead不会给你下一个不同的值,而是下一个实际的值。这意味着在你的情况下,前两行的lead_id是1,只有第三行的lead值是2。 –

回答

1

您可以通过添加在窗口条款列入FIRST_VALUE解析函数做到这一点:

with tablea as (select 1 id, 2.5 value from dual union all 
       select 1 id, 1 value from dual union all 
       select 1 id, 4.5 value from dual union all 
       select 2 id, 7 value from dual union all 
       select 2 id, 2 value from dual union all 
       select 3 id, 3 value from dual union all 
       select 4 id, 1 value from dual union all 
       select 4 id, 7 value from dual) 
select id, 
     value, 
     first_value(id) over (order by id 
          range between 1 following and unbounded following) lead_id 
from tablea; 

     ID  VALUE LEAD_ID 
---------- ---------- ---------- 
     1  2.5   2 
     1   1   2 
     1  4.5   2 
     2   7   3 
     2   2   3 
     3   3   4 
     4   1   
0

我觉得这给正确的输出:

WITH g AS 
    (SELECT ID, lead(ID) OVER (ORDER BY ID) lead_id 
    FROM (SELECT DISTINCT ID FROM TableA)) 
SELECT ID, VALUE, lead_id 
FROM TableA 
    JOIN g USING (ID) 
ORDER BY 1; 
0
SELECT tablea.*, b.nextid FROM tablea 
    INNER JOIN (SELECT id, LEAD (id) OVER (ORDER BY id) nextid 
       FROM ( SELECT DISTINCT id 
          FROM tablea 
          ORDER BY id)) b 
     ON tablea.id = b.id 

这应该工作。