Неясно для LAST_VALUE - предшествует - PullRequest
4 голосов
/ 28 ноября 2011

У меня есть таблица, которая выглядит следующим образом:

Date                   Value
01/01/2010 03:59:00     324.44
01/02/2010 09:31:00     NULL
01/02/2010 09:32:00     NULL
.
.
.
01/02/2010 11:42:00     NULL

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

select date, 
   nvl(value, LAST_VALUE(value IGNORE NULLS) over (order by value RANGE BETWEEN 1 PRECEDING AND CURRENT ROW)) value
from
    table

Это не показывает никакой разницы, но если я скажу RANGE BETWEEN 3 PRECEDING AND CURRENT ROW, это скопирует данные во все строки.Мне не понятно, почему это происходит.Может кто-нибудь объяснить, если я неправильно понимаю, как использовать предыдущий?

Ответы [ 2 ]

2 голосов
/ 28 ноября 2011

Аналитические функции все еще работают с наборами данных.Они не обрабатывают по одной строке за раз, для этого вам понадобится PL / SQL или MODEL.PRECEDING относится к последним X строкам, но до применения аналитической функции.

Эти проблемы могут сбивать с толку в SQL, поскольку вам нужно встроить логику в определение набора, а не пытаться передавать данныеиз одного ряда в другой.Вот почему я использовал CASE с LAST_VALUE в своем предыдущем ответе .


Редактировать:

Я добавилпростой набор данных, чтобы мы могли выполнить один и тот же запрос.VALUE1 мне кажется работает, я что-то упустил?Часть проблемы с VALUE2 заключается в том, что аналитическая ORDER BY использует VALUE вместо даты.

select id, the_date, value
    ,last_value(value ignore nulls) over
        (partition by id order by the_date) value1
    ,nvl(value, LAST_VALUE(value IGNORE NULLS) over
        (order by value RANGE BETWEEN 1 PRECEDING AND CURRENT ROW)) value2
from
(
    select 1 id, date '2011-01-01' the_date, 100  value from dual union all
    select 1 id, date '2011-01-02' the_date, null value from dual union all
    select 1 id, date '2011-01-03' the_date, null value from dual union all
    select 1 id, date '2011-01-04' the_date, null value from dual union all
    select 1 id, date '2011-01-05' the_date, 200  value from dual
)
order by the_date;

Результаты:

ID  THE_DATE    VALUE   VALUE1  VALUE2
1   1/1/2011    100     100     100
1   1/2/2011            100     
1   1/3/2011            100     
1   1/4/2011            100     
1   1/5/2011    200     200     200
0 голосов
/ 28 ноября 2011

Можно копировать одну строку за раз, потому что я сделал это, используя java Logic и Sql query

            Statement sta;
            ResultSet rs,rslast;

            try{

// Код создания соединения и «con» - это объект класса соединения, так что не смущайтесь.

    sta = con.createStatement();

    rs=sta.executeQuery("SELECT * FROM TABLE NAME");
    rslast=sta.executeQuery("SELECT * FROM TABLENAME WHERE ID = (SELECT MAX(ID) FROM TABLENAME)");
    rslast.next();
    String digit  =rslast.getString("ID");

    System.out.print("ID"+rslast.getString("ID")); // it gives ID of the Last Record.

Вместо этого вы можете также использовать ORDER by Date в порядке убывания.

Теперь я надеюсь, что вы сделаете логику, которая вставит только последнюю запись.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...