|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
ARRay001, И что же будет, если у вас последняя запись предыдущего месяца - первая суббота, а единственная следующего - последнее воскресенье? Вы для себя на бумажке логику распишите сначала, не надо ждать чуда от пока ещё добрых людей с форума. Оракл умеет реализовывать только ту логику, которая поддаётся алгоритмизации, не более того. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2020, 17:27 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
env, Такого быть не может. Обязательно будет присутствовать рабочий день следующего за текущим месяца в fld2 которого надо будет подставить значение fld3, вычисленное по последней имеющейся дате предыдущего текущей дате (на момент расчета) месяца. Более того, он будет равен первому рабочему дню после выходных. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2020, 17:34 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
ARRay001 Опять прошу прощения за некорректную постановку, но наконец сам понял что именно надо: Исходные данные (вариант генерации): Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
В данном примере находится значение 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 ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2020, 17:42 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
ARRay001 Обязательно будет присутствовать рабочий день следующего за текущим месяца Ок. Пусть будет. Последний день следующего месяца. Пока не расписаны имеющиеся ограничения и нет алгоритма действий - так и будете переделывать раз за разом. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2020, 17:51 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
Stax, Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Мы считаем на дату '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' . ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2020, 18:03 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
ARRay001 Код: plsql 1. 2.
О, великолепно. А если там будут 27.09.2020 и 31.10.2020 и нет других дат, то что брать? упд. цитату взял как пример того, что разрыв в данных может быть от конца месяца, до конца месяца ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2020, 18:08 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
env, Тогда расчёт не делается или 0 (даты для расчёта просто нет). Расчёт делается только в последний рабочий день месяца, либо на первый после выходных день следующего месяца. Если эта дата отсутствует - значит и расчёт ещё не сделан. Если вместо 29.09.2020 будет дата 27.09.2020 (любая максимальная дата сентября), то fld3 берётся по ней. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2020, 18:11 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
ARRay001 Stax, Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Мы считаем на дату '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 ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2020, 18:56 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
ARRay001 только в последний рабочий день месяца, либо на первый после выходных день следующего месяца О, ещё кусочек пазла. ARRay001, ну нет у остальных вашего контекста в голове. А хрустальные шары опять не работают. Полнее задачу ставьте, если хотите помощи. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2020, 09:40 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
env ARRay001 только в последний рабочий день месяца, либо на первый после выходных день следующего месяца О, ещё кусочек пазла. непонятно в будущее надо гаглядывать, или нет? ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2020, 10:44 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
Stax, нет - только те даты, что есть... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2020, 11:04 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
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' дублировать значение, вычисленное на предыдущий конец месяца. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2020, 11:33 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
ARRay001 если что не ясно уточняйте что именно Может лучше вы напишете уже внятно, что вам надо? Без необходимости уточнять. Это не нам надо решить вашу задачу, это вам нужно решение. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2020, 11:42 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
env, так я расписал всё подробно ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2020, 11:47 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
ARRay001, Соберите описание в одно сообщение. Укажите внятно граничные случаи и обязательные данные. И заодно покажите, а что сами-то сделали, чтобы решить задачу со всеми "подробными уточнениями". ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2020, 12:08 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
ARRay001 так я расписал всё подробно давайте я попробую чутку поменял (чтоб понятней было) Код: plsql 1. 2. 3. 4.
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2020, 12:36 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
Stax ARRay001 так я расписал всё подробно давайте я попробую чутку поменял (чтоб понятней было) Код: plsql 1. 2. 3. 4.
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2020, 14:02 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
ARRay001 - 02.11.2020 - раб - считаем за октябрь по последней дате сентября (30.09.2020) вместо 31.10.2020. Как искать - будущее относительно текущего или смотреть какие дни были до текущей (если не рабочие конца месяца, то считаем через месяц назад ) автор если если текущая дата конца месяца (здесь '31.10.2020' суббота) является выходным днём, то вычисленное значение lv ставится в fld2, соответствующее первой имеющейся рабочей дате (здесь это '02.11.2020') следующего имеющегося в наличии месяца (ближайшая дата следующего месяца обязательно будет присутствовать). противоречие через месяц назад и ближайшая дата следующего месяца зы авторЯ пока не понял как лучше делать. как лучше пока(временно) не рассматриваем будет несколько вариантов решения, тогда и лучшее выберите терзают меня смутные сомнения, что мож тут over и не надо, зачем для целого месяца повторять значения из "последний" записи из пред. месяца ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2020, 14:39 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
Stax, "противоречие через месяц назад и ближайшая дата следующего месяца " - противоречий нет: "Через месяц назад" - это относится к значению какое брать, а "ближайшая дата следующего месяца" - это к месту, куда это значение выводить (первый рабочий день следующего месяца). "терзают меня смутные сомнения, что мож тут over и не надо," - Может и не over, "зачем для целого месяца повторять значения из "последний" записи из пред. месяца" - согласен - лучше писать значения только в последнюю дату месяца (если она рабочая), иначе в первый рабочий день следующего месяца. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2020, 14:49 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
Завести календарь уже предлагали? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2020, 14:56 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2020, 15:03 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
graycode, что значит завести календарь? Есть таблица, где перечислены все рабочие и не рабочие дни. О ней я писал выше и от неё можно отталкиваться... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2020, 15:05 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
ARRay001, Отлично, теперь осталось четко описать алгоритм получения искомой даты не привязываясь к реализации, после чего можно приступать к реализации. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2020, 15:26 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
ARRay001 Stax, "противоречие через месяц назад и ближайшая дата следующего месяца " - противоречий нет: "Через месяц назад" - это относится к значению какое брать, а "ближайшая дата следующего месяца" - это к месту, куда это значение выводить (первый рабочий день следующего месяца). тоесть lv считать не для каждой строки, токо в первый рабочий день ARRay001 Stax, "терзают меня смутные сомнения, что мож тут over и не надо," - Может и не over, тема Использование оконных (аналитических) функций ARRay001 "зачем для целого месяца повторять значения из "последний" записи из пред. месяца" - согласен - лучше писать значения только в последнюю дату месяца (если она рабочая), иначе в первый рабочий день следующего месяца. вопрос не в лучше, а куда писать (вернее в какой строке), запутали Вы меня ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2020, 15:28 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
Постараюсь ещё раз описать алгоритм без привязки к реализации: Смотрим каждую последнюю дату месяца: 1) если это не выходной день (смотрим по таблице дат) -> ищем значение fld3 на последнюю дату предыдущего месяца и выводим в текущее fld2 2) если это выходной день (смотрим по таблице дат) -> -- ищем значение fld3 на последнюю дату предыдущего месяца -- ищем первый рабочий день следующего месяца и выводим в fld2 этого дня найденное значение fld3 всё. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2020, 16:45 |
|
|
start [/forum/topic.php?fid=52&msg=40022151&tid=1880632]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
137ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 249ms |
0 / 0 |