powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Использование оконных (аналитических) функций
25 сообщений из 96, страница 2 из 4
Использование оконных (аналитических) функций
    #40019340
ARRay001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env,
добавил коммент в условие выше. Сортировка по id не обязательна, так как даты итак будут отсортированы по времени.
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40019345
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
with t1 (id, date1, fld2, fld3) as
(
              select 111, to_date('31.10.2019', 'DD.MM.YYYY'), 10, '11' from dual
    union all select 222, to_date('01.11.2019', 'DD.MM.YYYY'), 15, '22' from dual
    union all select 333, to_date('05.11.2019', 'DD.MM.YYYY'), 30, '43' from dual
    union all select 111, to_date('26.08.2020', 'DD.MM.YYYY'), 10, '07' from dual
    union all select 111, to_date('28.09.2020', 'DD.MM.YYYY'), 10, '10' from dual
    union all select 111, to_date('30.09.2020', 'DD.MM.YYYY'), 10, '09' from dual
    union all select 111, to_date('30.10.2020', 'DD.MM.YYYY'), 10, '11' from dual
    union all select 111, to_date('31.10.2020', 'DD.MM.YYYY'), 10, '11' from dual
    union all select 222, to_date('01.11.2020', 'DD.MM.YYYY'), 15, '22' from dual
    union all select 333, to_date('05.11.2020', 'DD.MM.YYYY'), 30, '43' from dual    
)
select t1.*,
last_value(decode(last_day(date1), date1, fld3) ignore nulls) 
    over (order by trunc(date1, 'month') range between interval '1' month preceding and interval '1' month preceding) lv
from t1
order by date1;

        ID DATE1             FLD2 FLD3 LV
---------- ----------- ---------- ---- --
       111 31.10.2019          10 11   
       222 01.11.2019          15 22   11
       333 05.11.2019          30 43   11
       111 26.08.2020          10 07   
       111 28.09.2020          10 10   
       111 30.09.2020          10 09   
       111 30.10.2020          10 11   09
       111 31.10.2020          10 11   09
       222 01.11.2020          15 22   11
       333 05.11.2020          30 43   11

10 rows selected
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40019347
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ARRay001
Сортировка по id не обязательна, так как даты итак будут отсортированы по времени.


date1 содержит время ?
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40019350
ARRay001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AmKad,
интересное решение - надо осознать до конца и проверить у себя. Спасибо!
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40019354
ARRay001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
123йй,
к сожалению, оказалось, что не содержит. Но и повторов в конкретной выборке, скорее всего не будет. Так что, прошу прощения - условие упрощается. Сортировки по одной дате не нужно.
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40019378
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad,

не будет ли last_value плавающим/случайным из-за неуникальной сортировки order by trunc(date1, 'month')?

.....
stax
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40019387
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
AmKad,

не будет ли last_value плавающим/случайным из-за неуникальной сортировки order by trunc(date1, 'month')?

.....
stax
Буйки ограничивают плавающих предыдущим месяцем. А вот чтобы не было коллизий с определением последней даты месяца - нужно, чтобы не было ее повторений.
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40019500
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad
Stax
AmKad,

не будет ли last_value плавающим/случайным из-за неуникальной сортировки order by trunc(date1, 'month')?

.....
stax
Буйки ограничивают плавающих предыдущим месяцем. А вот чтобы не было коллизий с определением последней даты месяца - нужно, чтобы не было ее повторений.

допустим date1 без повторений но trunc(date1, 'month') для сортировки уже с повторениями (первое число)


.....
stax
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40020449
ARRay001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задачка опять видоизменилась. Берётся не последний день месяца, а последний день месяца, имеющийся в списке дат. Т.е. любая последняя дата предыдущего месяца. Наверное изменится интервал?
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40020454
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ARRay001
Задачка опять видоизменилась. Берётся не последний день месяца, а последний день месяца, имеющийся в списке дат. Т.е. любая последняя дата предыдущего месяца. Наверное изменится интервал?


не совсем понятно
мож достаточно убрать last_day

Код: 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.
SQL> ed
Wrote file afiedt.buf

  1  with t1 (id, date1, fld2, fld3) as
  2  (
  3                select 111, to_date('17.10.2019', 'DD.MM.YYYY'), 10, '11' from dual
  4      union all select 222, to_date('01.11.2019', 'DD.MM.YYYY'), 15, '22' from dual
  5      union all select 333, to_date('05.11.2019', 'DD.MM.YYYY'), 30, '43' from dual
  6      union all select 111, to_date('26.08.2020', 'DD.MM.YYYY'), 10, '07' from dual
  7      union all select 111, to_date('28.09.2020', 'DD.MM.YYYY'), 12, '10' from dual
  8      union all select 111, to_date('22.10.2020', 'DD.MM.YYYY'), 14, '13' from dual
  9      union all select 111, to_date('27.10.2020', 'DD.MM.YYYY'), 15, '17' from dual
 10      union all select 222, to_date('01.11.2020', 'DD.MM.YYYY'), 16, '22' from dual
 11      union all select 333, to_date('05.11.2020', 'DD.MM.YYYY'), 30, '43' from dual
 12  )
 13  select t1.*,
 14  --last_value(decode(last_day(date1), date1, fld3) ignore nulls)
 15  last_value(fld3 ignore nulls)
 16      over (order by trunc(date1, 'month') range between interval '1' month preceding and interval '1' month preceding) lv
 17  from t1
 18* order by date1
SQL> /

        ID DATE1            FLD2 FL LV
---------- ---------- ---------- -- --
       111 17.10.2019         10 11
       222 01.11.2019         15 22 11
       333 05.11.2019         30 43 11
       111 26.08.2020         10 07
       111 28.09.2020         12 10 07
       111 22.10.2020         14 13 10
       111 27.10.2020         15 17 10
       222 01.11.2020         16 22 17
       333 05.11.2020         30 43 17

9 rows selected.

SQL>



.....
stax
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40020509
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ARRay001,

я не могу понять (токо время потратил вместо чтоб ...) как работает order by trunc(date1, 'month') range between interval '1' month preceding and interval '1' month preceding

сделал влоб (наверняка красивее можно напр exact day и тд)

мож пригодится



Код: 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.
40.
41.
42.
43.
44.
SQL> ed
Wrote file afiedt.buf

  1  with t1 (id, date1, fld2, fld3) as
  2  (
  3                select 1, to_date('30.10.2019', 'DD.MM.YYYY'), 10, '1122      ' from dual
  4      union all select 2, to_date('01.11.2019', 'DD.MM.YYYY'), 15, '22' from dual
  5      union all select 3, to_date('25.11.2019', 'DD.MM.YYYY'), 30, '40' from dual
  6      union all select 4, to_date('20.11.2019', 'DD.MM.YYYY'), 30, '44' from dual
  7      union all select 5, to_date('27.11.2019', 'DD.MM.YYYY'), 30, '41' from dual
  8      union all select 6, to_date('05.11.2019', 'DD.MM.YYYY'), 30, '06' from dual
  9      union all select 7, to_date('11.12.2019', 'DD.MM.YYYY'), 10, '07' from dual
 10      union all select 8, to_date('01.12.2019', 'DD.MM.YYYY'), 10, '57' from dual
 11      union all select 9, to_date('28.09.2020', 'DD.MM.YYYY'), 12, '10' from dual
 12      union all select 10, to_date('27.10.2020', 'DD.MM.YYYY'), 14, '13' from dual
 13      union all select 11, to_date('23.10.2020', 'DD.MM.YYYY'), 15, '17' from dual
 14      union all select 12, to_date('01.11.2020', 'DD.MM.YYYY'), 16, '22' from dual
 15      union all select 13, to_date('05.11.2020', 'DD.MM.YYYY'), 30, '43' from dual
 16  )
 17  select t1.*,
 18  last_value(fld3)
 19      over (order by date1 range between to_char(date1,'dd')+to_char(trunc(date1,'mm')-1,'dd')-1 preceding
 20                                    and  to_char(date1,'dd') preceding) prev_month
 21  from t1
 22* order by date1
SQL> /

        ID DATE1            FLD2 FLD3       PREV_MONTH
---------- ---------- ---------- ---------- ----------
         1 30.10.2019         10 1122
         2 01.11.2019         15 22         1122
         6 05.11.2019         30 06         1122
         4 20.11.2019         30 44         1122
         3 25.11.2019         30 40         1122
         5 27.11.2019         30 41         1122
         8 01.12.2019         10 57         41
         7 11.12.2019         10 07         41
         9 28.09.2020         12 10
        11 23.10.2020         15 17         10
        10 27.10.2020         14 13         10
        12 01.11.2020         16 22         13
        13 05.11.2020         30 43         13

13 rows selected.



.....
stax
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40020541
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ARRay001
Задачка опять видоизменилась. Берётся не последний день месяца, а последний день месяца, имеющийся в списке дат. Т.е. любая последняя дата предыдущего месяца. Наверное изменится интервал?
Stax

мож достаточно убрать last_day

Код: plsql
1.
2.
 15  last_value(fld3 ignore nulls)
 16      over (order by trunc(date1, 'month') range between interval '1' month preceding and interval '1' month preceding) lv

В этом случае не гарантируется сортировка дат внутри месяца.
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40020545
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ARRay001
Задачка опять видоизменилась. Берётся не последний день месяца, а последний день месяца, имеющийся в списке дат. Т.е. любая последняя дата предыдущего месяца.

Код: plsql
1.
2.
3.
last_value(fld3) over 
    (order by date1 range between date1 - add_months(trunc(date1, 'month'), -1) preceding 
                              and date1            - trunc(date1, 'month') + 1  preceding) lv
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40020554
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad

ARRay001
Задачка опять видоизменилась. Берётся не последний день месяца, а последний день месяца, имеющийся в списке дат. Т.е. любая последняя дата предыдущего месяца. Наверное изменится интервал?
Stax

мож достаточно убрать last_day

Код: plsql
1.
2.
 15  last_value(fld3 ignore nulls)
 16      over (order by trunc(date1, 'month') range between interval '1' month preceding and interval '1' month preceding) lv

В этом случае не гарантируется сортировка дат внутри месяца.


22233858

я вообще не понял как оно работает (какое окно выщитывает)
Код: 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.
40.
41.
42.
43.
  1  with t1 (id, date1, fld2, fld3) as
  2  (
  3                select 1, to_date('30.10.2019', 'DD.MM.YYYY'), 10, '1122      ' from dual
  4      union all select 2, to_date('01.11.2019', 'DD.MM.YYYY'), 15, '22' from dual
  5      union all select 3, to_date('25.11.2019', 'DD.MM.YYYY'), 30, '40' from dual
  6      union all select 4, to_date('20.11.2019', 'DD.MM.YYYY'), 30, '44' from dual
  7      union all select 5, to_date('27.11.2019', 'DD.MM.YYYY'), 30, '41' from dual
  8      union all select 6, to_date('05.11.2019', 'DD.MM.YYYY'), 30, '06' from dual
  9      union all select 7, to_date('11.12.2019', 'DD.MM.YYYY'), 10, '07' from dual
 10      union all select 8, to_date('01.12.2019', 'DD.MM.YYYY'), 10, '57' from dual
 11      union all select 9, to_date('28.09.2020', 'DD.MM.YYYY'), 12, '10' from dual
 12      union all select 10, to_date('27.10.2020', 'DD.MM.YYYY'), 14, '13' from dual
 13      union all select 11, to_date('23.10.2020', 'DD.MM.YYYY'), 15, '17' from dual
 14      union all select 12, to_date('01.11.2020', 'DD.MM.YYYY'), 16, '22' from dual
 15      union all select 13, to_date('05.11.2020', 'DD.MM.YYYY'), 30, '43' from dual
 16  )
 17  select t1.*,
 18  last_value(fld3)
 19      over (order by date1 range between to_char(date1,'dd')+to_char(trunc(date1,'mm')-1,'dd')-1 preceding
 20                                    and  to_char(date1,'dd') preceding) prev_month
 21  ,last_value(fld3 ignore nulls)
 22        over (order by trunc(date1, 'month') range between interval '1' month preceding and interval '1' month preceding) lv_interval
 23  from t1
 24* order by date1
SQL> /

        ID DATE1            FLD2 FLD3       PREV_MONTH LV_INTERVA
---------- ---------- ---------- ---------- ---------- ----------
         1 30.10.2019         10 1122
         2 01.11.2019         15 22         1122       1122
         6 05.11.2019         30 06         1122       1122
         4 20.11.2019         30 44         1122       1122
         3 25.11.2019         30 40         1122       1122
         5 27.11.2019         30 41         1122       1122
         8 01.12.2019         10 57         41         44
         7 11.12.2019         10 07         41         44
         9 28.09.2020         12 10
        11 23.10.2020         15 17         10         10
        10 27.10.2020         14 13         10         10
        12 01.11.2020         16 22         13         17
        13 05.11.2020         30 43         13         17

13 rows selected.



зі
забыл за -1 add_month (старость)

.....
stax
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40020560
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax

Код: plsql
1.
order by trunc(date1, 'month') range between interval '1' month preceding and interval '1' month preceding)

Это имело смысл только для первичной постановки задачи вкупе с last_day + ignore nulls. Для новой постановки такая сортировка не подходит.
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40021406
ARRay001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Однако, за время пути... опять новость: надо ещё эту дату сравнивать с результатом запроса, который показывает выходной это или нет. Если выходной, то брать первый день следующего месяца вместо последней даты из предыдущего месяца...
Запрос вида: select t.wd from wdate t where t.date = date1, где t.wd = 0 - не рабочие дни, 1 - рабочие
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40021424
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ARRay001,

Сделайте уже календарь со всеми необходимыми датами и признаками
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40021425
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ARRay001

то брать первый день следующего месяца вместо последней даты из предыдущего месяца...


а потом окажется что первый день следующего месяца выходной и надо ...

зы
рассчитайте два поля 1-последний день пред. месяца и первый день текущего (если я правильно понял)
и в зависимости от выходного выбирайте одну из зол

зыы
мож проще создать ф-цию и в ней "любе"

.....
stax
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40021427
ARRay001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,
функция не впишется в концепцию данного решения - это всё сначала делать в pl/sql.
Я бы делал что-то вроде: проверяю последнюю, имеющуюся в наличии, дату предыдущего месяца. Если она не вых - берём её, если вых - ищу первую имеющуюся рабочую дату следующего месяца. Вот как лучше запихнуть всё это в один аналитический запрос - что-то с case скорее всего...
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40021473
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ARRay001

Вот как лучше запихнуть всё это в один аналитический запрос - что-то с case скорее всего...


как луче я не знаю, как через два поля я описал (если я правильно понимаю задачку)

приведите данные (with t1 (id, date1, fld2, fld3) as ... )
и что получить


.....
stax
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40021519
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ARRay001
env,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
with t1 (id, date1, fld2, fld3) as
(
              select 111, to_date('10.10.2020', 'DD.MM.YYYY'), 10, '11' from dual
    union all select 222, to_date('11.10.2020', 'DD.MM.YYYY'), 15, '22' from dual
    union all select 333, to_date('12.10.2020', 'DD.MM.YYYY'), 30, '43' from dual
    
)
select t1.*
from t1;



Результат: В строке с датой '12.10.2020' надо, допустим, значение fld2 сделать равным значению fld3 на у даты '10.10.2020'.


Дословный ответ.

Код: plsql
1.
2.
3.
4.
5.
6.
select id, date1, 
       case date1 when to_date('12.10.2020', 'DD.MM.YYYY')
                  then to_number((select max(fld3) from t1 where date1=to_date('10.10.2020', 'DD.MM.YYYY'))) 
                  else fld2 end,
       fld3
       from t1;
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40021520
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ARRay001
Задачка опять видоизменилась. Берётся не последний день месяца, а последний день месяца, имеющийся в списке дат. Т.е. любая последняя дата предыдущего месяца. Наверное изменится интервал?


Напишите новые таблицы задачи и желаемый результат,
чтобы не бегать между начальником и форумом "А это, правильный ответ?"

Добрая воля имеет пределы :)
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40022028
ARRay001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Исходные данные не поменялись. Пример приводили много раз выше. Вот, вариант генерации:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
with t1 (id, date1, fld2, fld3) as
(
              select 111, to_date('31.10.2019', 'DD.MM.YYYY'), 10, '11' from dual
    union all select 222, to_date('01.11.2019', 'DD.MM.YYYY'), 15, '22' from dual
    union all select 333, to_date('05.11.2019', 'DD.MM.YYYY'), 30, '43' from dual
    union all select 111, to_date('26.08.2020', 'DD.MM.YYYY'), 10, '07' from dual
    union all select 111, to_date('28.09.2020', 'DD.MM.YYYY'), 10, '10' from dual
    union all select 111, to_date('30.09.2020', 'DD.MM.YYYY'), 10, '09' from dual
    union all select 111, to_date('30.10.2020', 'DD.MM.YYYY'), 10, '11' from dual
    union all select 111, to_date('31.10.2020', 'DD.MM.YYYY'), 10, '11' from dual
    union all select 222, to_date('01.11.2020', 'DD.MM.YYYY'), 15, '22' from dual
    union all select 333, to_date('05.11.2020', 'DD.MM.YYYY'), 30, '43' from dual    
)
select t1.*,
 last_value(fld3) over 
    (order by date1 range between date1 - add_months(trunc(date1, 'month'), -1) preceding 
                              and date1            - trunc(date1, 'month') + 1  preceding) lv
from t1
order by date1;



В данном примере находится значение lv, равное значению fld3 по последней дате из предыдущего месяца, имеющейся в таблице (НЕ ПОСЛЕДНЕЙ ДАТЕ предыдущего месяца, а ПОСЛЕДНЕЙ ИМЕЮЩЕЙСЯ ДАТЕ предыдущего месяца).
Задача: видоизменить расчёт lv, чтобы если последняя имеющаяся дата предыдущего месяца является выходным днём (т.е. сравнивается с результатом из таблицы с датами select t.wd from wdate t where t.date = date1, где t.wd = 0 - не рабочие дни, 1 - рабочие), то берётся первая имеющаяся рабочая дата следующего имеющегося в наличии месяца.
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40022092
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ARRay001,

'30.09.2020' и '30.10.2020' выходные
для
union all select 111, to_date('30.10.2020', 'DD.MM.YYYY'), 10, '11' from dual
что насчитаете?

ps
желательно ид сделать уникальными, так легче общатся

.....
stax
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40022131
ARRay001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Опять прошу прощения за некорректную постановку, но наконец сам понял что именно надо:
Исходные данные (вариант генерации):
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
with t1 (id, date1, fld2, fld3) as
(
              select 111, to_date('31.10.2019', 'DD.MM.YYYY'), 10, '11' from dual
    union all select 222, to_date('01.11.2019', 'DD.MM.YYYY'), 15, '22' from dual
    union all select 333, to_date('05.11.2019', 'DD.MM.YYYY'), 30, '43' from dual
    union all select 111, to_date('26.08.2020', 'DD.MM.YYYY'), 10, '07' from dual
    union all select 111, to_date('28.09.2020', 'DD.MM.YYYY'), 10, '10' from dual
    union all select 111, to_date('30.09.2020', 'DD.MM.YYYY'), 10, '09' from dual
    union all select 111, to_date('30.10.2020', 'DD.MM.YYYY'), 10, '11' from dual
    union all select 111, to_date('31.10.2020', 'DD.MM.YYYY'), 10, '11' from dual
    union all select 222, to_date('01.11.2020', 'DD.MM.YYYY'), 15, '22' from dual
    union all select 222, to_date('02.11.2020', 'DD.MM.YYYY'), 15, '22' from dual
    union all select 333, to_date('05.11.2020', 'DD.MM.YYYY'), 30, '43' from dual    
)
select t1.*,
 last_value(fld3) over 
    (order by date1 range between date1 - add_months(trunc(date1, 'month'), -1) preceding 
                              and date1            - trunc(date1, 'month') + 1  preceding) lv
from t1
order by date1;



В данном примере находится значение lv, равное значению fld3 по последней дате из предыдущего месяца, имеющейся в таблице (НЕ ПОСЛЕДНЕЙ ДАТЕ предыдущего месяца, а ПОСЛЕДНЕЙ ИМЕЮЩЕЙСЯ ДАТЕ предыдущего месяца).
Задача: если если текущая дата конца месяца (здесь '31.10.2020' суббота) является выходным днём (т.е. сравнивается с результатом из таблицы с датами select t.wd from wdate t where t.date = date1, где t.wd = 0 - не рабочие дни, 1 - рабочие), то вычисленное значение lv ставится в fld2, соответствующее первой имеющейся рабочей дате (здесь это '02.11.2020') следующего имеющегося в наличии месяца (ближайшая дата следующего месяца обязательно будет присутствовать). Если текущая дата конца месяца рабочая, то значение lv подставляется в fld2 по текущей дате.
Трудновато выделить всё в отдельный пример. Изменится структура данного запроса.
...
Рейтинг: 0 / 0
25 сообщений из 96, страница 2 из 4
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Использование оконных (аналитических) функций
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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