2014-01-09 66 views
0

我想我理解它是如何工作的,但現在我感到困惑。FIRST_VALUE函數不能按預期工作

我有一個數據集:

id date  value 
1 20080101 null 
2 20090101 34 
3 20100101 null 

三個記錄,從2008年1月,2009年和2010年。現在,我想創建一個新列「值2」與最新的非空值。基本上我想要一個有3個34的value2列。我寫:

select id, date, value, first_value(value) ignore nulls over (order by date desc) as value2 from table 

但是,我得到:

id date  value value2 
1 20080101 null 34 
2 20090101 34  34 
3 20100101 null null 

的最後一個值仍然是空不是34.這是怎麼回事錯在這裏?

+1

我從http://stackoverflow.com/questions/1228910/找到了答案什麼,錯用,此一價值查詢 – Steve

回答

0

嘗試通過條款

消除順序空衣被合計一種可能的解決方案可能是

with x as (
    select 1 as id , 20080101 as ddate , null as v from dual union all 
    select 2 , 20090101 ,34 from dual union all 
    select 3 , 20100101 ,null from dual union all 
    select 4 , 20090101 ,15 from dual union all 
    select 5 , 20110101 ,null from dual union all 
    select 6 , 20120101 ,null from dual union all 
    select 7 , 20030101 ,55 from dual 
) 
select x.* , 
    first_value(v) over (order by case when v is null then null else ddate end) as last_nn_v 
from x 
order by ddate 
/

     ID  DDATE   V LAST_NN_V 
---------- ---------- ---------- ---------- 
     7 20030101   55   55 
     1 20080101     55 
     4 20090101   15   55 
     2 20090101   34   55 
     3 20100101     55 
     5 20110101     55 
     6 20120101     55 
0

你忘記了窗外。缺省值是無界前沿和當前行之間的範圍,意味着您的值正在從第一行到當前行的窗口中查找。你的排序行是:

id date  value 
3 20100101 null 
2 20090101 34 
1 20080101 null 
  • 對於ID爲1的記錄,3,2,1是關注的焦點。值34在第二行中找到。
  • 對於id 2,記錄3和2處於焦點。值34在第二行中找到。
  • 對於id 3,只有記錄3處於焦點。因此無法找到值34。

順便說一句:你的請求中有一個錯字:它是first_value(值忽略空值),而不是first_value(值)忽略空值。

1

解析函數的默認窗口是ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW,如果你將其更改爲ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING,那麼你會得到期望的結果:

查詢1

WITH table_name AS (
      SELECT 1 AS id, TO_DATE('20080101', 'YYYYMMDD') AS "date", NULL AS value FROM DUAL 
    UNION ALL SELECT 2, TO_DATE('20090101', 'YYYYMMDD'), 34 FROM DUAL 
    UNION ALL SELECT 3, TO_DATE('20100101', 'YYYYMMDD'), NULL FROM DUAL 
) 
SELECT id, 
     "date", 
     value, 
     FIRST_VALUE(value IGNORE NULLS) OVER (ORDER BY "date" DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS value2 
FROM table_name; 

結果

ID | date     | VALUE | VALUE2 
------------------------------------------------- 
3 | 2010-01-01 00:00:00 | (null) | 34 
2 | 2009-01-01 00:00:00 | 34  | 34 
1 | 2008-01-01 00:00:00 | (null) | 34 
相關問題