powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / lag skip nulls
5 сообщений из 5, страница 1 из 1
lag skip nulls
    #39418187
oracle_adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.
Подскажите, как получить последний курс игнорируя null.
То есть 5-го и 6-го числа курс должен быть 0.4618 .
Если бы в lag можно было игнорировать null, то было бы замечательно.
Спасибо
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
begin_date          course
2017-03-01	0.4697	 
2017-03-02	0.4676	
2017-03-03	0.4636	
2017-03-04	0.4618	
2017-03-05	   null        
2017-03-06	   null	
2017-03-07	0.465	
2017-03-08	0.4644	
2017-03-09	0.4646	
2017-03-10	0.4576	
...
Рейтинг: 0 / 0
lag skip nulls
    #39418246
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oracle_adm,

Ввиду отсутствия опции ignore nulls у оконных lead / lag / last_value / first_value решить в лоб не получится, но можно совершить обманный манёвр и решить на оконном max-e по конкатенации полей с датой и курсом
...
Рейтинг: 0 / 0
lag skip nulls
    #39418252
oracle_adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Щукина Анна,
Спасибо, Анна.
Попробую)
...
Рейтинг: 0 / 0
lag skip nulls
    #39418322
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oracle_adm,

если не получится, то вот "образец" решения:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
with t as (
            select date'2017-03-01' as begin_date, 0.4697 as course from dual union all
            select date'2017-03-02' as begin_date, 0.4676 as course from dual union all
            select date'2017-03-03' as begin_date, 0.4636 as course from dual union all
            select date'2017-03-04' as begin_date, 0.4618 as course from dual union all
            select date'2017-03-05' as begin_date,   null as course from dual union all
            select date'2017-03-06' as begin_date,   null as course from dual union all
            select date'2017-03-07' as begin_date,  0.465 as course from dual union all
            select date'2017-03-08' as begin_date, 0.4644 as course from dual union all
            select date'2017-03-09' as begin_date, 0.4646 as course from dual union all
            select date'2017-03-10' as begin_date, 0.4576 as course from dual
          )
select begin_date, course
     , to_number
         (substr
           (max(
                 case 
                   when course is null then null 
                   else to_char(begin_date,'yyyymmddhh24miss') || to_char(course) 
                 end
               ) 
              over(order by begin_date)
            ,15
           )
         ) fill_c
  from t;
  
    BEGIN_DATE        COURSE   FILL_C
-------------------   ------   ------
01.03.2017 00:00:00   0,4697   0,4697
02.03.2017 00:00:00   0,4676   0,4676
03.03.2017 00:00:00   0,4636   0,4636
04.03.2017 00:00:00   0,4618   0,4618
05.03.2017 00:00:00            0,4618
06.03.2017 00:00:00            0,4618
07.03.2017 00:00:00    0,465    0,465
08.03.2017 00:00:00   0,4644   0,4644
09.03.2017 00:00:00   0,4646   0,4646
10.03.2017 00:00:00   0,4576   0,4576



P.S.
синтаксис немного оракловый, но основной ход мыслей должен быть понятен, тем более, что практически все используемые функции имеют прямые аналоги в Postgre
...
Рейтинг: 0 / 0
lag skip nulls
    #39418452
oracle_adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Щукина Анна,
еще раз спасибо.
Я уже решил задачу более развесисто,
но ваш вариант выглядит компактнее, зарефакторю пожалуй))
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / lag skip nulls
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]