2014-01-09 4 views
0

Мне показалось, что я понял, как это работает, но теперь я смущен.Функция FIRST_VALUE работает не так, как ожидалось

У меня есть набор данных:

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

Три записи, с января 2008, 2009 и 2010. Теперь я хочу, чтобы создать новый столбец «значение2» с последним ненулевым значением. В принципе, мне нужен столбец value2 с 3 34s. Я пишу:

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 

Последнее значение по-прежнему не Null 34. Что происходит здесь не так?

+1

Я нашел ответ от http://stackoverflow.com/questions/1228910/ Что-неправильно-с этим-первым значением-запросом – Steve

ответ

0

Try исключая нуль Valus в порядке п

Возможное решение может быть

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 
  • Для ид 1 записей, 3, 2, 1 находятся в фокусе. Значение 34 находится во втором ряду из них.
  • Для идентификатора 2 записи 3, 2 находятся в фокусе. Значение 34 находится во втором ряду из них.
  • Для идентификатора 3 только запись 3 находится в фокусе. Следовательно, значение 34 не может быть найдено.

ОТВЕТ: В вашем запросе есть опечатка: это first_value (значение игнорирует значения null), а не first_value (значение) игнорировать значения null.

1

окно по умолчанию для аналитических функций ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW, если изменить его ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING тогда вы получите желаемый результат:

Query 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 
Смежные вопросы