powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Использование оконных (аналитических) функций
25 сообщений из 96, страница 3 из 4
Использование оконных (аналитических) функций
    #40022135
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ARRay001,

И что же будет, если у вас последняя запись предыдущего месяца - первая суббота, а единственная следующего - последнее воскресенье?

Вы для себя на бумажке логику распишите сначала, не надо ждать чуда от пока ещё добрых людей с форума.
Оракл умеет реализовывать только ту логику, которая поддаётся алгоритмизации, не более того.
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40022140
ARRay001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env,
Такого быть не может. Обязательно будет присутствовать рабочий день следующего за текущим месяца в fld2 которого надо будет подставить значение fld3, вычисленное по последней имеющейся дате предыдущего текущей дате (на момент расчета) месяца. Более того, он будет равен первому рабочему дню после выходных.
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40022146
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 по текущей дате.
Трудновато выделить всё в отдельный пример. Изменится структура данного запроса.


для строки с '01.11.2020' какой роезультат
распишите как получить (берем предыдущий месяц (10), ищем последнюю дату (31.10.2020), смотрим выходной ли -продолжте)

авторЕсли текущая дата конца месяца рабочая, то значение lv подставляется в fld2 по текущей дате.

я пока вообще не понял

зы
в примере id, fld2, fld3 сделайте уникальными, удобнее будет говорить о строках(рядках))

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

Ок. Пусть будет. Последний день следующего месяца.

Пока не расписаны имеющиеся ограничения и нет алгоритма действий - так и будете переделывать раз за разом.
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40022156
ARRay001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,
Код: 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 444, to_date('26.08.2020', 'DD.MM.YYYY'), 10, '07' from dual
    union all select 555, to_date('28.09.2020', 'DD.MM.YYYY'), 10, '10' from dual
    union all select 666, to_date('30.09.2020', 'DD.MM.YYYY'), 10, '09' from dual
    union all select 777, to_date('30.10.2020', 'DD.MM.YYYY'), 10, '11' from dual
    union all select 888, to_date('31.10.2020', 'DD.MM.YYYY'), 10, '11' from dual
    union all select 999, to_date('01.11.2020', 'DD.MM.YYYY'), 15, '22' from dual
    union all select 112, to_date('02.11.2020', 'DD.MM.YYYY'), 15, '22' from dual
    union all select 113, 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;



Мы считаем на дату '31.10.2020' (последняя дата октября) - анализ следующий:
- В '01.11.2020' (воскресенье) fld2 = 0.
- В '02.11.2020' (первый рабочий день после '31.10.2020') fld2 = '09' (значение fld3 на дату '30.09.2020' (это последний день месяца, предшествующего '31.10.2020'),
Если бы '01.11.2020' был бы рабочим днём, то для него также бралось бы значение fld3 на дату '30.09.2020', т.е. fld2 = '09' .
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40022157
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ARRay001
Код: plsql
1.
2.
union all select 666, to_date('30.09.2020', 'DD.MM.YYYY'), 10, '09' from dual
    union all select 777, to_date('30.10.2020', 'DD.MM.YYYY'), 10, '11' from dual


О, великолепно. А если там будут 27.09.2020 и 31.10.2020 и нет других дат, то что брать?

упд. цитату взял как пример того, что разрыв в данных может быть от конца месяца, до конца месяца
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40022158
ARRay001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env,
Тогда расчёт не делается или 0 (даты для расчёта просто нет). Расчёт делается только в последний рабочий день месяца, либо на первый после выходных день следующего месяца. Если эта дата отсутствует - значит и расчёт ещё не сделан. Если вместо 29.09.2020 будет дата 27.09.2020 (любая максимальная дата сентября), то fld3 берётся по ней.
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40022177
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ARRay001

Stax,
Код: 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 444, to_date('26.08.2020', 'DD.MM.YYYY'), 10, '07' from dual
    union all select 555, to_date('28.09.2020', 'DD.MM.YYYY'), 10, '10' from dual
    union all select 666, to_date('30.09.2020', 'DD.MM.YYYY'), 10, '09' from dual
    union all select 777, to_date('30.10.2020', 'DD.MM.YYYY'), 10, '11' from dual
    union all select 888, to_date('31.10.2020', 'DD.MM.YYYY'), 10, '11' from dual
    union all select 999, to_date('01.11.2020', 'DD.MM.YYYY'), 15, '22' from dual
    union all select 112, to_date('02.11.2020', 'DD.MM.YYYY'), 15, '22' from dual
    union all select 113, 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;



Мы считаем на дату '31.10.2020' (последняя дата октября) - анализ следующий:
- В '01.11.2020' (воскресенье) fld2 = 0.
- В '02.11.2020' (первый рабочий день после '31.10.2020') fld2 = '09' (значение fld3 на дату '30.09.2020' (это последний день месяца, предшествующего '31.10.2020'),
Если бы '01.11.2020' был бы рабочим днём, то для него также бралось бы значение fld3 на дату '30.09.2020', т.е. fld2 = '09' .


откуда '30. 09 .2020' для строки с '01.11.2020' (выходной)?

напишите все без если бы

01.11.2020, 31.10.2020 выходной
... в результате получим
222 01.11.2020 15 22 ??

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

О, ещё кусочек пазла.

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

О, ещё кусочек пазла.


непонятно
в будущее надо гаглядывать, или нет?

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

откуда '30.09.2020' для строки с '01.11.2020' (выходной)? - для строки с '01.11.2020' (выходной) расчёт делать не надо - там '0'

напишите все без если бы - я написал вроде максимально точно, если что не ясно уточняйте что именно

01.11.2020, 31.10.2020 выходной
... в результате получим такие результаты:

666 '30.09.2020' (посл. раб день месяца) - , 10, '09'
777 '30.10.2020' (раб) - , '0' т.к. для этой даты можно не считать, т.к. это не конец месяца', '11'
888 '31.10.2020' (вых) - , '0', '11'
999 '01.11.2020' (вых) - , '0', '22'
112 '02.11.2020' (раб) - , '09' (=fld3 за '30.09.2020'),'22'

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

Может лучше вы напишете уже внятно, что вам надо? Без необходимости уточнять.

Это не нам надо решить вашу задачу, это вам нужно решение.
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40022402
ARRay001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env,
так я расписал всё подробно
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40022404
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ARRay001,

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

так я расписал всё подробно

давайте я попробую

чутку поменял (чтоб понятней было)
Код: plsql
1.
2.
3.
4.
    union all select 777, to_date('30.10.2020', 'DD.MM.YYYY'), 10, '11' from dual
    union all select 888, to_date('31.10.2020', 'DD.MM.YYYY'), 10, '110' from dual
    union all select 999, to_date('01.11.2020', 'DD.MM.YYYY'), 15, '22' from dual
    union all select 112, to_date('02.11.2020', 'DD.MM.YYYY'), 15, '220' from dual



1) считаем показатель (lv) для каждой строки (over по другому не умеют)
2) пример
31.10.2020 01.11.2020 выходные wd=0

считаем для строки с 999, to_date('01.11.2020'

2.1 берем предыдущий месяц - 10 -й
2.2 ищем в предыдущем месяце последний день - 31/10 (не обязательно 31)
2.3 последний в передыдущем 31/10 выходной, не подходит
2.3.1 берем текуший для строки месяц - 10
2.3.2 ищем в текущем месяце первый рабочий - 02/11 (будущее относительно текущего 01.11.2020)
2.3.3 ответ для строки с ид=999 ,берем значение fld3 со строки с ид=112 - lv=220

что не так?

ps
если для выходного дня "не считать", а возвращать lv напр -1 то окно будет по текущую строку (дату)


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

так я расписал всё подробно

давайте я попробую

чутку поменял (чтоб понятней было)
Код: plsql
1.
2.
3.
4.
    union all select 777, to_date('30.10.2020', 'DD.MM.YYYY'), 10, '11' from dual
    union all select 888, to_date('31.10.2020', 'DD.MM.YYYY'), 10, '110' from dual
    union all select 999, to_date('01.11.2020', 'DD.MM.YYYY'), 15, '22' from dual
    union all select 112, to_date('02.11.2020', 'DD.MM.YYYY'), 15, '220' from dual



1) считаем показатель (lv) для каждой строки (over по другому не умеют) - если нельзя иначе, то да
2) пример
31.10.2020 01.11.2020 выходные wd=0

считаем для строки с 999, to_date('01.11.2020'

2.1 берем предыдущий месяц - 10 -й
2.2 ищем в предыдущем месяце последний день - 31/10 (не обязательно 31)
2.3 последний в передыдущем 31/10 выходной, не подходит
2.3.1 берем текуший для строки месяц - 10
2.3.2 ищем в текущем месяце первый рабочий - 02/11 (будущее относительно текущего 01.11.2020)
2.3.3 ответ для строки с ид=999 ,берем значение fld3 со строки с ид=112 - lv=220

что не так? - сама суть. Вот мой вариант:
для строки с 999, to_date('01.11.2020' считать ничего не нужно - там 0)
Идём по порядку дат:
- 31.10.2020 - вых - не считаем
- 01.11.2020 - вых - не считаем
- 02.11.2020 - раб - считаем за октябрь по последней дате сентября (30.09.2020) вместо 31.10.2020.
Как искать - будущее относительно текущего или смотреть какие дни были до текущей (если не рабочие конца месяца, то считаем через месяц назад) - это вопрос выбора при проектировании алгоритма. Я пока не понял как лучше делать.
- соответственно, берём значение fld3 со строки где дата 30.09.2020

ps
если для выходного дня "не считать", а возвращать lv напр -1 то окно будет по текущую строку (дату)
это тоже вопрос проектирования алгоритма - главное, чтобы понятно было, что там нет значения или 0.


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


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


автор если если текущая дата конца месяца (здесь '31.10.2020' суббота) является выходным днём, то вычисленное значение lv ставится в fld2, соответствующее первой имеющейся рабочей дате (здесь это '02.11.2020') следующего имеющегося в наличии месяца (ближайшая дата следующего месяца обязательно будет присутствовать).


противоречие через месяц назад и ближайшая дата следующего месяца

зы
авторЯ пока не понял как лучше делать.

как лучше пока(временно) не рассматриваем
будет несколько вариантов решения, тогда и лучшее выберите

терзают меня смутные сомнения, что мож тут over и не надо,
зачем для целого месяца повторять значения из "последний" записи из пред. месяца

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

"противоречие через месяц назад и ближайшая дата следующего месяца " - противоречий нет:

"Через месяц назад" - это относится к значению какое брать, а "ближайшая дата следующего месяца" - это к месту, куда это значение выводить (первый рабочий день следующего месяца).
"терзают меня смутные сомнения, что мож тут over и не надо," - Может и не over,
"зачем для целого месяца повторять значения из "последний" записи из пред. месяца" - согласен - лучше писать значения только в последнюю дату месяца (если она рабочая), иначе в первый рабочий день следующего месяца.
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40022473
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Завести календарь уже предлагали?
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40022479
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
graycode,

Да 22237267 , не помогло
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40022481
ARRay001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
graycode,
что значит завести календарь? Есть таблица, где перечислены все рабочие и не рабочие дни. О ней я писал выше и от неё можно отталкиваться...
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40022490
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ARRay001,

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

"противоречие через месяц назад и ближайшая дата следующего месяца " - противоречий нет:

"Через месяц назад" - это относится к значению какое брать, а "ближайшая дата следующего месяца" - это к месту, куда это значение выводить (первый рабочий день следующего месяца).

тоесть lv считать не для каждой строки, токо в первый рабочий день

ARRay001
Stax,
"терзают меня смутные сомнения, что мож тут over и не надо," - Может и не over,

тема Использование оконных (аналитических) функций

ARRay001

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


вопрос не в лучше, а куда писать (вернее в какой строке), запутали Вы меня

.....
stax
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40022503
ARRay001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Постараюсь ещё раз описать алгоритм без привязки к реализации:
Смотрим каждую последнюю дату месяца:
1) если это не выходной день (смотрим по таблице дат) -> ищем значение fld3 на последнюю дату предыдущего месяца и выводим в текущее fld2
2) если это выходной день (смотрим по таблице дат) ->
-- ищем значение fld3 на последнюю дату предыдущего месяца
-- ищем первый рабочий день следующего месяца и выводим в fld2 этого дня найденное значение fld3

всё.
...
Рейтинг: 0 / 0
25 сообщений из 96, страница 3 из 4
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Использование оконных (аналитических) функций
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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