|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
ARRay001, про fld2 я не понял вот что я нафантазировал Код: 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. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78.
ps мож надо некоторые with материализовать ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2020, 17:08 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
ARRay001 Постараюсь ещё раз описать алгоритм без привязки к реализации: Смотрим каждую последнюю дату месяца: 1) если это не выходной день (смотрим по таблице дат) -> ищем значение fld3 на последнюю дату предыдущего месяца и выводим в текущее fld2 2) если это выходной день (смотрим по таблице дат) -> -- ищем значение fld3 на последнюю дату предыдущего месяца -- ищем первый рабочий день следующего месяца и выводим в fld2 этого дня найденное значение fld3 всё. Очень странное описание, почему в fld2, оно другого типа и с другим диапазоном значений, если 29, 30, 31 и 01 следующего месяца - нерабочие дни, то дата я так полагаю должна попасть в 02, т.е. предположение о последней дате месяца мягко говоря не выдерживает критики. Итак, попробую описать как выглядит ваша задача на самом деле. Есть некое поле fld3, есть периоды (месяцы), требуется для всех строк попадающих в определенный период вывести поле fld3_prev, со значением из строки с самой последней датой предыдущего периода (месяца), при этом даты которые есть не годятся для расчетов, т.е. эффективные даты нужно предварительно получить следующим образом - эффективная дата равна первому рабочему дню больше или равному исходной дате. Верное описание? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2020, 19:00 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
graycode ARRay001 Постараюсь ещё раз описать алгоритм без привязки к реализации: Смотрим каждую последнюю дату месяца: 1) если это не выходной день (смотрим по таблице дат) -> ищем значение fld3 на последнюю дату предыдущего месяца и выводим в текущее fld2 2) если это выходной день (смотрим по таблице дат) -> -- ищем значение fld3 на последнюю дату предыдущего месяца -- ищем первый рабочий день следующего месяца и выводим в fld2 этого дня найденное значение fld3 всё. Очень странное описание, почему в fld2, оно другого типа и с другим диапазоном значений, если 29, 30, 31 и 01 следующего месяца - нерабочие дни, то дата я так полагаю должна попасть в 02, т.е. предположение о последней дате месяца мягко говоря не выдерживает критики. Итак, попробую описать как выглядит ваша задача на самом деле. Есть некое поле fld3, есть периоды (месяцы), требуется для всех строк попадающих в определенный период вывести поле fld3_prev, со значением из строки с самой последней датой предыдущего периода (месяца), при этом даты которые есть не годятся для расчетов, т.е. эффективные даты нужно предварительно получить следующим образом - эффективная дата равна первому рабочему дню больше или равному исходной дате. Верное описание? А чем моё описание не так? Поля все, кроме даты имеют строковый тип в итоге. Мне важна суть решения. С предыдущим решением ещё не разобрался, но похоже на истину. Вот переделанная ваша трактовка: Есть все поля: дата, fld3 и fld2 (у меня их намного больше и с unpivot). Требуется для всех строк, соответствующих последнему дню месяца (если они есть) и являющихся рабочими днями вывести поле fld3_prev, со значением из строки с самой последней датой предыдущего периода (месяца) в текущее поле fld2, при этом, если последний день месяца является нерабочим днем и не годится для подстановки (, т.е. эффективные даты для подстановки нужно предварительно получить следующим образом - эффективная дата равна первому рабочему дню больше или равному исходной дате), то fld3_prev выводится в полученную эффективную дату в поле fld2. Можно это с другой стороны перевернуть - это как лучше для алгоритма расчета. Но суть такая. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2020, 21:18 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
ARRay001, Что вы пытаетесь сделать мне не понятно, может быть Stax догадается, я пас. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2020, 21:34 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
graycode, правда не понимаю, как ещё расписать условие. Надо ставить в текущее поле fld2 значения fld3 с последней даты предыдущего месяца, если текущая дата рабочая. Если текущее не рабочая дата, то ставим то же самое fld3 не в текущее fld2, а в fld2 ниже - на первую рабочую дату следующего месяца. Причем отбирать в качестве текущих только даты окончания месяцев в качестве точки отсчета (значения fld2 в остальные даты месяца = 0). Также fld2=0 будет у дат окончания месяца, которые выходные. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2020, 23:51 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
Stax ARRay001, про fld2 я не понял вот что я нафантазировал Код: 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. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78.
ps мож надо некоторые with материализовать ..... stax Логика почти верна, с той разницей, что не надо включать логику "нерабочие/рабочие дни" при поиске fld3 выше. Эта логика включается при выборе, напротив какой даты ставить найденное значение fld3. Выбивается последнее значение. Ну и писаться должно не в отдельный LV, а в fld2, но это уже фигня - это я сам додумаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 00:20 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
Немного ошибся: Как должно быть: ID DATE1 FLD2 FLD3 WD LV ---------- ---------- ---------- -- ---------- -- 1 10.01.2020 10 11 1 2 11.01.2020 15 22 1 3 12.01.2020 30 43 1 4 01.07.2020 10 17 0 5 21.07.2020 15 27 1 6 30.07.2020 30 07 1 43 7 13.08.2020 10 14 0 8 17.08.2020 15 24 1 9 29.08.2020 30 02 1 07 10 03.09.2020 10 14 1 11 27.09.2020 15 24 1 12 29.09.2020 30 04 0 10 07.10.2020 10 12 1 02 11 27.10.2020 15 22 1 12 31.10.2020 30 42 0 10 01.11.2020 10 15 0 11 02.11.2020 15 25 1 04 12 20.11.2020 30 05 1 42 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 01:09 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
ARRay001 Немного ошибся: Как должно быть: понял чутку освобожусь, сделаю без "Ну и писаться должно не в отдельный LV, а в fld2, но это уже фигня - это я сам додумаю" пока не оптимально (не знаю как луче over или select max(l.fld3) KEEP ...) постараюсь к обеду ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 09:47 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
а что, на этом форуме больше не посылают в ветку "помощь студентам" и т.д? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 12:09 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
ARRay001, Код: 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. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83.
select max(l.fld3) KEEP можно заменить на аналитику last_value w жалко было выбрасывать или реализовать через джоины вариантов много напр посчитать и для выходного перенести на первое первые/последнии дни искать по другому и тд так-как выборка не должна быть громадной макс 367*к-во лет ничего не оптимизировал, делал влоб для старых версий ps допускаю что что-то не допонял или понял но неправильно реализовал ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 12:25 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
merch а что, на этом форуме больше не посылают в ветку "помощь студентам" и т.д? к сожленью я уже не студент, хотя я только учусь ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 12:27 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
Stax, супер, спасибо! Осталось мне только полностью осознать решение для того, чтобы перенести и поддерживать. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 12:39 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
ARRay001, повторюсь делал влоб вариантов много, наверняка можно улучшить ...... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 12:42 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
Stax, В общем, опять забраковали постановку (сам не рад). Теперь получается последний вариант надо совместить с предыдущим. Т.е. мы учитываем выхи ещё и когда смотрим, откуда брать fld3. Иначе говоря, если предыдущая дата была выходным и был сдвиг на рабочий, то при расчёте следующего берём fld3 из этой рабочей даты предыдущего сдвига (теперь она как бы конец предыдущего месяца). Т.е. правильный вариант теперь такой: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 17:26 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
ARRay001 Stax, В общем, опять забраковали постановку (сам не рад). запутали Вы меня (конец дня туго соображаю) если инфа напр за 10лет, то ето макс 4000 записей (не много) забить на аналитику и считать ф-цией все 4000-а в масив, а дальше хоть выходной, хоть празничный результат возращать пайпом или колекцией зі я и в предыдущей постановке не все понял напр за месяц токо одна строка с рабочим днем, а предыдущий месяц заканчивается выходным ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 18:08 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
Stax ARRay001 Stax, В общем, опять забраковали постановку (сам не рад). запутали Вы меня (конец дня туго соображаю) если инфа напр за 10лет, то ето макс 4000 записей (не много) забить на аналитику и считать ф-цией все 4000-а в масив, а дальше хоть выходной, хоть празничный результат возращать пайпом или колекцией зі я и в предыдущей постановке не все понял напр за месяц токо одна строка с рабочим днем, а предыдущий месяц заканчивается выходным ..... stax Почему же? Решение-то было верное по той постановке! Уже много написано аналитики для перехода на функцию. Если за месяц только одна строка с рабочим днём, а предыдущий месяц заканчивается выходным, то в этот рабочий день пишется только fld3 за позапрошлый месяц (т.е. расчёт на последний день предыдущего месяца). В тот месяц, в котором только один рабочий день - этот день никогда не будет концом месяца. Всегда при достижении даты конца месяца, будет присутствовать первый рабочий день месяца после выходных. А итог за предыдущий месяц считается только при наступлении даты конца месяца, не раньше. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 18:25 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
ARRay001, А где ваши попытки реализовать описанную вами же логику на основе внимательного изучения предложенных вариантов решения? Или вы решили сесть Стасу на шею в надежде чужими руками сделать свою работу? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 09:08 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
env, а зачем ? его задача авторУже много написано аналитики для перехода на функцию ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 09:50 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
env, уровень моих знаний аналитики ещё не так высок - всё даётся с трудом ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 13:22 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
Stax, можно не решать последний вариант. Я нашел другое решение вопроса. Там в таблице хранилось готовое значение с минимумом аналитики. Подставил в последний вариант и всё вроде срослось. Если только для собственного интереса) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 17:27 |
|
Использование оконных (аналитических) функций
|
|||
---|---|---|---|
#18+
ARRay001 Stax, можно не решать последний вариант. Я нашел другое решение вопроса. Там в таблице хранилось готовое значение с минимумом аналитики. Подставил в последний вариант и всё вроде срослось. Если только для собственного интереса) я еще не совсем созрел для решения новой постановки (не осознал что надо) да и предыдущее решение, достаточно громоздкое и мож там не все нюансы учтены напр select max(l.fld3) KEEP from l так как признак выходного уже не используется то искать луче в T1 (исходной выборке) делал на коленке, мож еще что-то напутал (не понял) ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 17:54 |
|
|
start [/forum/topic.php?fid=52&msg=40022565&tid=1880632]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
132ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 253ms |
0 / 0 |