powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Использование оконных (аналитических) функций
21 сообщений из 96, страница 4 из 4
Использование оконных (аналитических) функций
    #40022508
Фотография 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.
with t1 (id, date1, fld2, fld3) as (
              select 1, to_date('10.01.2020', 'DD.MM.YYYY'), 10, '11' from dual
    union all select 2, to_date('11.01.2020', 'DD.MM.YYYY'), 15, '22' from dual
    union all select 3, to_date('12.01.2020', 'DD.MM.YYYY'), 30, '43' from dual
--
    union all select 4, to_date('01.07.2020', 'DD.MM.YYYY'), 10, '17' from dual
    union all select 5, to_date('21.07.2020', 'DD.MM.YYYY'), 15, '27' from dual
    union all select 6, to_date('30.07.2020', 'DD.MM.YYYY'), 30, '07' from dual
--
    union all select 7, to_date('13.08.2020', 'DD.MM.YYYY'), 10, '14' from dual
    union all select 8, to_date('17.08.2020', 'DD.MM.YYYY'), 15, '24' from dual
    union all select 9, to_date('29.08.2020', 'DD.MM.YYYY'), 30, '02' from dual
--
    union all select 10, to_date('03.09.2020', 'DD.MM.YYYY'), 10, '14' from dual
    union all select 11, to_date('27.09.2020', 'DD.MM.YYYY'), 15, '24' from dual
    union all select 12, to_date('29.09.2020', 'DD.MM.YYYY'), 30, '04' from dual
--
    union all select 10, to_date('07.10.2020', 'DD.MM.YYYY'), 10, '12' from dual
    union all select 11, to_date('27.10.2020', 'DD.MM.YYYY'), 15, '22' from dual
    union all select 12, to_date('31.10.2020', 'DD.MM.YYYY'), 30, '42' from dual
--
    union all select 10, to_date('01.11.2020', 'DD.MM.YYYY'), 10, '15' from dual
    union all select 11, to_date('02.11.2020', 'DD.MM.YYYY'), 15, '25' from dual
    union all select 12, to_date('20.11.2020', 'DD.MM.YYYY'), 30, '05' from dual
)
,wdate (dat,wd) as( 
              select to_date('31.10.2019', 'DD.MM.YYYY'), 0 from dual
    union all select to_date('31.10.2020', 'DD.MM.YYYY'), 0 from dual
    union all select to_date('13.08.2020', 'DD.MM.YYYY'), 0 from dual
    union all select to_date('29.09.2020', 'DD.MM.YYYY'), 0 from dual
    union all select to_date('01.11.2020', 'DD.MM.YYYY'), 0 from dual
    union all select to_date('01.07.2020', 'DD.MM.YYYY'), 0 from dual
)
,w as ( -- +календар выходных
 select t1.*,nvl(wd,1) wd from t1 t1,wdate w where date1=dat(+)
-- order by 2
)
, l as ( --последняя строка в месяце не выходной
select 
  trunc(date1,'mm') date1
  ,max(fld3) KEEP (DENSE_RANK last ORDER BY date1) fld3
--  ,max(wd) KEEP (DENSE_RANK last ORDER BY date1) wd
from w
group by trunc(date1,'mm')
having max(wd) KEEP (DENSE_RANK last ORDER BY date1)=1
)
 select w.*
 ,decode(
   first_value(decode(wd,1,date1) ignore nulls) over (partition by trunc(date1,'mm') order by date1) --первый рабочий день в месяце
     ,date1
     ,(select max(l.fld3) KEEP (DENSE_RANK last ORDER BY l.date1) from l where l.date1<trunc(w.date1,'mm')) --пред месяцы 
    ) lv
from w order by 2
/
SQL> /

        ID DATE1            FLD2 FL         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 43
         6 30.07.2020         30 07          1
         7 13.08.2020         10 14          0
         8 17.08.2020         15 24          1 07
         9 29.08.2020         30 02          1
        10 03.09.2020         10 14          1 02
        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 02
        12 20.11.2020         30 05          1

18 rows selected.



ps
мож надо некоторые with материализовать

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

всё.

Очень странное описание, почему в fld2, оно другого типа и с другим диапазоном значений, если 29, 30, 31 и 01 следующего месяца - нерабочие дни, то дата я так полагаю должна попасть в 02, т.е. предположение о последней дате месяца мягко говоря не выдерживает критики.

Итак, попробую описать как выглядит ваша задача на самом деле.

Есть некое поле fld3, есть периоды (месяцы), требуется для всех строк попадающих в определенный период вывести поле fld3_prev, со значением из строки с самой последней датой предыдущего периода (месяца), при этом даты которые есть не годятся для расчетов, т.е. эффективные даты нужно предварительно получить следующим образом - эффективная дата равна первому рабочему дню больше или равному исходной дате. Верное описание?
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40022563
ARRay001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.

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

Что вы пытаетесь сделать мне не понятно, может быть Stax догадается, я пас.
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40022592
ARRay001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
graycode,
правда не понимаю, как ещё расписать условие.
Надо ставить в текущее поле fld2 значения fld3 с последней даты предыдущего месяца, если текущая дата рабочая. Если текущее не рабочая дата, то ставим то же самое fld3 не в текущее fld2, а в fld2 ниже - на первую рабочую дату следующего месяца. Причем отбирать в качестве текущих только даты окончания месяцев в качестве точки отсчета (значения fld2 в остальные даты месяца = 0). Также fld2=0 будет у дат окончания месяца, которые выходные.
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40022595
ARRay001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.
with t1 (id, date1, fld2, fld3) as (
              select 1, to_date('10.01.2020', 'DD.MM.YYYY'), 10, '11' from dual
    union all select 2, to_date('11.01.2020', 'DD.MM.YYYY'), 15, '22' from dual
    union all select 3, to_date('12.01.2020', 'DD.MM.YYYY'), 30, '43' from dual
--
    union all select 4, to_date('01.07.2020', 'DD.MM.YYYY'), 10, '17' from dual
    union all select 5, to_date('21.07.2020', 'DD.MM.YYYY'), 15, '27' from dual
    union all select 6, to_date('30.07.2020', 'DD.MM.YYYY'), 30, '07' from dual
--
    union all select 7, to_date('13.08.2020', 'DD.MM.YYYY'), 10, '14' from dual
    union all select 8, to_date('17.08.2020', 'DD.MM.YYYY'), 15, '24' from dual
    union all select 9, to_date('29.08.2020', 'DD.MM.YYYY'), 30, '02' from dual
--
    union all select 10, to_date('03.09.2020', 'DD.MM.YYYY'), 10, '14' from dual
    union all select 11, to_date('27.09.2020', 'DD.MM.YYYY'), 15, '24' from dual
    union all select 12, to_date('29.09.2020', 'DD.MM.YYYY'), 30, '04' from dual
--
    union all select 10, to_date('07.10.2020', 'DD.MM.YYYY'), 10, '12' from dual
    union all select 11, to_date('27.10.2020', 'DD.MM.YYYY'), 15, '22' from dual
    union all select 12, to_date('31.10.2020', 'DD.MM.YYYY'), 30, '42' from dual
--
    union all select 10, to_date('01.11.2020', 'DD.MM.YYYY'), 10, '15' from dual
    union all select 11, to_date('02.11.2020', 'DD.MM.YYYY'), 15, '25' from dual
    union all select 12, to_date('20.11.2020', 'DD.MM.YYYY'), 30, '05' from dual
)
,wdate (dat,wd) as( 
              select to_date('31.10.2019', 'DD.MM.YYYY'), 0 from dual
    union all select to_date('31.10.2020', 'DD.MM.YYYY'), 0 from dual
    union all select to_date('13.08.2020', 'DD.MM.YYYY'), 0 from dual
    union all select to_date('29.09.2020', 'DD.MM.YYYY'), 0 from dual
    union all select to_date('01.11.2020', 'DD.MM.YYYY'), 0 from dual
    union all select to_date('01.07.2020', 'DD.MM.YYYY'), 0 from dual
)
,w as ( -- +календар выходных
 select t1.*,nvl(wd,1) wd from t1 t1,wdate w where date1=dat(+)
-- order by 2
)
, l as ( --последняя строка в месяце не выходной
select 
  trunc(date1,'mm') date1
  ,max(fld3) KEEP (DENSE_RANK last ORDER BY date1) fld3
--  ,max(wd) KEEP (DENSE_RANK last ORDER BY date1) wd
from w
group by trunc(date1,'mm')
having max(wd) KEEP (DENSE_RANK last ORDER BY date1)=1
)
 select w.*
 ,decode(
   first_value(decode(wd,1,date1) ignore nulls) over (partition by trunc(date1,'mm') order by date1) --первый рабочий день в месяце
     ,date1
     ,(select max(l.fld3) KEEP (DENSE_RANK last ORDER BY l.date1) from l where l.date1<trunc(w.date1,'mm')) --пред месяцы 
    ) lv
from w order by 2
/
SQL> /

        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 43 ->ВЕРНО
         6 30.07.2020         30 07          1
         7 13.08.2020         10 14          0
         8 17.08.2020         15 24          1 07 ->ВЕРНО
         9 29.08.2020         30 02          1
        10 03.09.2020         10 14          1 02 ->ВЕРНО
        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 02 ->НЕ ВЕРНО (должно быть 04, по дате 29.09.2020) 
        12 20.11.2020         30 05          1

18 rows selected.



ps
мож надо некоторые with материализовать

.....
stax


Логика почти верна, с той разницей, что не надо включать логику "нерабочие/рабочие дни" при поиске fld3 выше. Эта логика включается при выборе, напротив какой даты ставить найденное значение fld3. Выбивается последнее значение. Ну и писаться должно не в отдельный LV, а в fld2, но это уже фигня - это я сам додумаю.
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40022600
ARRay001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Немного ошибся:

Как должно быть:

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
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40022656
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ARRay001
Немного ошибся:

Как должно быть:


понял

чутку освобожусь, сделаю без "Ну и писаться должно не в отдельный LV, а в fld2, но это уже фигня - это я сам додумаю"
пока не оптимально (не знаю как луче over или select max(l.fld3) KEEP ...)
постараюсь к обеду

.....
stax
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40022722
merch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а что, на этом форуме больше не посылают в ветку "помощь студентам" и т.д?
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40022731
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
with t1 (id, date1, fld2, fld3) as (
              select 1, to_date('10.01.2020', 'DD.MM.YYYY'), 10, '11' from dual
    union all select 2, to_date('11.01.2020', 'DD.MM.YYYY'), 15, '22' from dual
    union all select 3, to_date('12.01.2020', 'DD.MM.YYYY'), 30, '43' from dual
--
    union all select 4, to_date('01.05.2020', 'DD.MM.YYYY'), 10, '17' from dual
    union all select 5, to_date('21.05.2020', 'DD.MM.YYYY'), 15, '27' from dual
    union all select 6, to_date('30.05.2020', 'DD.MM.YYYY'), 30, '07' from dual
--
    union all select 7, to_date('13.08.2020', 'DD.MM.YYYY'), 10, '14' from dual
    union all select 8, to_date('17.08.2020', 'DD.MM.YYYY'), 15, '24' from dual
    union all select 9, to_date('29.08.2020', 'DD.MM.YYYY'), 30, '02' from dual
--
    union all select 10, to_date('03.09.2020', 'DD.MM.YYYY'), 10, '14' from dual
    union all select 11, to_date('27.09.2020', 'DD.MM.YYYY'), 15, '24' from dual
    union all select 12, to_date('29.09.2020', 'DD.MM.YYYY'), 30, '04' from dual
--
    union all select 10, to_date('07.10.2020', 'DD.MM.YYYY'), 10, '12' from dual
    union all select 11, to_date('27.10.2020', 'DD.MM.YYYY'), 15, '22' from dual
    union all select 12, to_date('31.10.2020', 'DD.MM.YYYY'), 30, '42' from dual
--
    union all select 10, to_date('01.11.2020', 'DD.MM.YYYY'), 10, '15' from dual
    union all select 11, to_date('02.11.2020', 'DD.MM.YYYY'), 15, '25' from dual
    union all select 12, to_date('20.11.2020', 'DD.MM.YYYY'), 30, '05' from dual
)
,wdate (dat,wd) as(
              select to_date('31.10.2019', 'DD.MM.YYYY'), 0 from dual
    union all select to_date('31.10.2020', 'DD.MM.YYYY'), 0 from dual
    union all select to_date('13.08.2020', 'DD.MM.YYYY'), 0 from dual
    union all select to_date('29.09.2020', 'DD.MM.YYYY'), 0 from dual
    union all select to_date('01.11.2020', 'DD.MM.YYYY'), 0 from dual
    union all select to_date('01.07.2020', 'DD.MM.YYYY'), 0 from dual
)
,w as ( -- +календар выходных
 select
  t1.*
  ,nvl(wd,1) wd
  ,decode(nvl(wd,1),1,date1) date_work
 from t1 t1,wdate w where date1=dat(+)
-- order by 2
)
, l as ( --последняя строка в месяце /*не выходной*/
select
  trunc(date1,'mm') date1
  ,max(fld3) KEEP (DENSE_RANK last ORDER BY date1) fld3
--  ,max(wd) KEEP (DENSE_RANK last ORDER BY date1) wd
from w
group by trunc(date1,'mm')
--having max(wd) KEEP (DENSE_RANK last ORDER BY date1)=1
)
select w.*
 ,case
    when lead(cast(null as number),1,wd) over (partition by trunc(date1,'mm') order by date1)=1 --последний  день тек месяца рабочий
              then (select max(l.fld3) KEEP (DENSE_RANK last ORDER BY l.date1) from l where l.date1<trunc(w.date1,'mm'))
    when lag(null,1,wd) over (partition by trunc(date_work,'mm') order by date1)=1 --первый рабочий день тек месяца
       and last_value(wd) over (order by date1 range between --последний день "предыдущего" месяца
                                                    UNBOUNDED PRECEDING AND date1-trunc(date1,'mm') PRECEDING)=0
              then (select max(l.fld3) KEEP (DENSE_RANK last ORDER BY l.date1) from l where l.date1<add_months(trunc(w.date1,'mm'),-1))
 end lv
from w order by 2

SQL> /

        ID DATE1            FLD2 FL         WD DATE_WORK  LV
---------- ---------- ---------- -- ---------- ---------- --
         1 10.01.2020         10 11          1 10.01.2020
         2 11.01.2020         15 22          1 11.01.2020
         3 12.01.2020         30 43          1 12.01.2020
         4 01.05.2020         10 17          1 01.05.2020
         5 21.05.2020         15 27          1 21.05.2020
         6 30.05.2020         30 07          1 30.05.2020 43
         7 13.08.2020         10 14          0
         8 17.08.2020         15 24          1 17.08.2020
         9 29.08.2020         30 02          1 29.08.2020 07
        10 03.09.2020         10 14          1 03.09.2020
        11 27.09.2020         15 24          1 27.09.2020
        12 29.09.2020         30 04          0
        10 07.10.2020         10 12          1 07.10.2020 02
        11 27.10.2020         15 22          1 27.10.2020
        12 31.10.2020         30 42          0
        10 01.11.2020         10 15          0
        11 02.11.2020         15 25          1 02.11.2020 04
        12 20.11.2020         30 05          1 20.11.2020 42



select max(l.fld3) KEEP можно заменить на аналитику last_value
w жалко было выбрасывать
или реализовать через джоины

вариантов много
напр посчитать и для выходного перенести на первое

первые/последнии дни искать по другому
и тд

так-как выборка не должна быть громадной макс 367*к-во лет
ничего не оптимизировал, делал влоб для старых версий

ps
допускаю что что-то не допонял
или понял но неправильно реализовал

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


к сожленью я уже не студент, хотя я только учусь

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

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

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

Т.е. правильный вариант теперь такой:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
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 12
12 20.11.2020 30 05 1 25
...
Рейтинг: 0 / 0
Использование оконных (аналитических) функций
    #40025371
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ARRay001
Stax,
В общем, опять забраковали постановку (сам не рад).

запутали Вы меня (конец дня туго соображаю)

если инфа напр за 10лет, то ето макс 4000 записей (не много)

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

результат возращать пайпом или колекцией

зі
я и в предыдущей постановке не все понял
напр за месяц токо одна строка с рабочим днем, а предыдущий месяц заканчивается выходным

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

запутали Вы меня (конец дня туго соображаю)

если инфа напр за 10лет, то ето макс 4000 записей (не много)

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

результат возращать пайпом или колекцией

зі
я и в предыдущей постановке не все понял
напр за месяц токо одна строка с рабочим днем, а предыдущий месяц заканчивается выходным

.....
stax


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

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

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


я еще не совсем созрел для решения новой постановки (не осознал что надо)

да и предыдущее решение, достаточно громоздкое и мож там не все нюансы учтены

напр
select max(l.fld3) KEEP from l
так как признак выходного уже не используется то искать луче в T1 (исходной выборке)

делал на коленке, мож еще что-то напутал (не понял)

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


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