2015-11-26 14 views
0

Так это то, что я вижуКак я могу получить последнее ненулевое значение в столбце

Column 1 Column 2 Column 3 

103.46 15-10-02 150.60 
381.67 15-10-02 150.60 
741.31 15-10-03 0 
14.21 15-10-03 0 
35.37 15-10-05 0 
11.24 15-10-12 19.23 
13.77 15-10-13 0 

, и я хотел бы, чтобы вставить предыдущую ненулевое значение из колонки 3, где имеется нулевой в колонке 3

так я хотел бы видеть что-то вроде

Column 1 Column 2 Column 3 

103.46 15-10-02 150.60 
381.67 15-10-02 150.60 
741.31 15-10-03 150.60 
14.21 15-10-03 150.60 
35.37 15-10-05 150.60 
11.24 15-10-12 19.23 
13.77 15-10-13 19.23 

Любая помощь будет принята с благодарностью!

+0

Что вы пытаетесь ГНФАР? И какой СУБД mysql или sql-server? – deterministicFail

+3

Учитывая, что строки в СУБД представляют собой неупорядоченные множества, которые являются «предыдущими» (хотя в данном конкретном случае это может и не иметь значения) - и какие RDBMS вы используете? – Strawberry

+0

Я нахожусь в oracle sql developer, и когда я говорю «предыдущий», я имею в виду предыдущий день/дату (столбец 2) с ассоциированным ненулевым значением в столбце 3 Я пробовал вести данные, но так как i имеют несколько значений дня, это, похоже, не является правильным вариантом здесь –

ответ

1

LAST_VALUE() будет делать то, что вам нужно:

with table1 as (select 103.46 col1, to_date('01/10/2015', 'dd/mm/yyyy') col2, 0 col3 from dual union all 
       select 381.67 col1, to_date('02/10/2015', 'dd/mm/yyyy') col2, 150.60 col3 from dual union all 
       select 741.31 col1, to_date('03/10/2015', 'dd/mm/yyyy') col2, 0 col3 from dual union all 
       select 14.21 col1, to_date('03/10/2015', 'dd/mm/yyyy') col2, 0 col3 from dual union all 
       select 35.37 col1, to_date('05/10/2015', 'dd/mm/yyyy') col2, 0 col3 from dual union all 
       select 11.24 col1, to_date('12/10/2015', 'dd/mm/yyyy') col2, 19.23 col3 from dual union all 
       select 13.77 col1, to_date('13/10/2015', 'dd/mm/yyyy') col2, 0 col3 from dual) 
select col1, 
     col2, 
     nvl(last_value(decode(col3, 0, cast(null as number), col3)) ignore nulls over (order by col2, col3 desc), 0) col3 
from table1; 

     COL1 COL2    COL3 
---------- ---------- ---------- 
    103.46 01/10/2015   0 
    381.67 02/10/2015  150.6 
    741.31 03/10/2015  150.6 
    14.21 03/10/2015  150.6 
    35.37 05/10/2015  150.6 
    11.24 12/10/2015  19.23 
    13.77 13/10/2015  19.23 
+0

Это бомба. Работал как красивый! То, что мне нужно. Спасибо и 100 лет хороших урожаев для вас и вашей семьи! –

+0

Я обновил ответ, чтобы включить случай, когда самое раннее значение равно 0; без nvl вокруг него, это будет выглядеть без значения, тогда как вы, вероятно, все еще хотите вернуть 0 в этом случае. Кроме того, я выбрал нуль в декоде для числа, поскольку он преобразовывал столбец чисел в строку, что может быть или не быть проблемой для вас. И удачи вам и вашим * {:-) – Boneist

+0

Просто будьте осторожны, что означает последнее значение, здесь заказ выполнен col2, col3, необязательно того же порядка, что и данные, поступающие на db. Вы должны включить идентификатор колонки autonumeric, чтобы убедиться в этом порядке. Или используйте DATETIME вместо DATE –

-1

Считаете ли вы использование CASE STATEMENT?

CASE 
    WHEN Column1 <> 0 THEN Column1 
    WHEN Column2 <> 0 THEN Column2 
    ELSE Column3 
END AS NewColumn3 
+0

Это не соответствует требованиям OP вообще. Он не ссылается на предыдущую строку вообще. – Boneist

+0

Упс! Я не понял этот вопрос. Вы правы, мое решение не работает вообще. –

Смежные вопросы