Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Нужна подсказка (Оконные функции) / 25 сообщений из 26, страница 1 из 2
29.10.2020, 15:53
    #40013092
ObserverZ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна подсказка (Оконные функции)
Добрый день, уважаемые форумчане!

Помогите составить запрос.

Есть таблица Table1 (пример)

Номер Фамилия Имя Отчество Дата
1 Иванов Иван Иванович 01.01.2000
1 Иванов Иван Иванович 02.01.2000
1 Акимов Иван Иванович 04.01.2000
2 Петров Петр Петрович 04.01.2000
2 Петров Петр Петрович 07.01.2000
3 Сидоров Сидор Сидорович 08.01.2000

В итоге нужно получить таблицу вида:

Номер Фамилия Имя Отчество Начало Конец
1 Иванов Иван Иванович 01.01.2020 03.01.2000
1 Акимов Иван Иванович 04.01.2020 -
2 Петров Петр Петрович 04.01.2020 -
3 Сидоров Сидор Сидорович 08.01.2020 -

Объяснение: Поля Фамилия Имя Отчество могут меняться при одинаковом поле Номер. В итоговую таблицу в поле "Начало" должна попадать минимальная дата, в поле "Конец" - взять дату из строки изменения поля и вычесть 1 день. Если изменения полей не было - проставить null.

Набросок запроса:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT DISTINCT
            n,
            last_name,
            first_name,
            patronymic,
            min(date) over(partition by 
                n, 
                last_name, 
                first_name, 
                patronymic) as Nachalo,
            ???
FROM Table 1




Понимаю, что скорее всего нужно использовать lead(), но сообразить не могу.
...
Рейтинг: 0 / 0
29.10.2020, 16:03
    #40013098
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна подсказка (Оконные функции)
ObserverZ,

для
1 Иванов Иван Иванович 01.01.2000
1 Иванов Иван Иванович 02.01.2000
1 Акимов Иван Иванович 04.01.2000
1 Иванов Иван Иванович 12.01.2000
1 Иванов Иван Иванович 14.01.2000

что ?

.....
stax
...
Рейтинг: 0 / 0
29.10.2020, 16:10
    #40013099
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна подсказка (Оконные функции)
ObserverZ,

stff start_of_group
...
Рейтинг: 0 / 0
29.10.2020, 16:17
    #40013101
ObserverZ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна подсказка (Оконные функции)
Stax,

1 Иванов Иван Иванович 01.01.2020 03.01.2000
1 Акимов Иван Иванович 04.01.2020 11.01.2000
1 Иванов Иван Иванович 12.01.2020 -
...
Рейтинг: 0 / 0
29.10.2020, 16:25
    #40013104
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна подсказка (Оконные функции)
ObserverZ,

Накидал на коленке, допилите под себя
Код: 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.
with t as 
(
    select 1 n, 'A' s1, 'A' s2, date '2020-01-01' dt from dual union all
    select 1 n, 'A' s1, 'A' s2, date '2020-01-04' dt from dual union all
    select 1 n, 'А' s1, 'A' s2, date '2020-01-06' dt from dual union all
    select 2 n, 'X' s1, 'X' s2, date '2020-01-01' dt from dual union all
    select 2 n, 'X' s1, 'X' s2, date '2020-03-01' dt from dual union all
    select 3 n, 'Y' s1, 'Y' s2, date '2020-02-01' dt from dual union all
    select 3 n, 'Y' s1, 'Z' s2, date '2020-04-04' dt from dual union all
    select 3 n, 'Y' s1, 'Y' s2, date '2020-05-06' dt from dual
),
stff_start_of_group as
(
    select 
        t.*,
        decode(nvl(t.s1,'@')||'#'||nvl(t.s2,'@'), lag(nvl(t.s1,'@')||'#'||nvl(t.s2,'@'), 1, nvl(t.s1,'@')||'#'||nvl(t.s2,'@')) over (partition by n order by dt), 0, 1) grp
    from 
        t
),
groups as
(
  select 
      s.*,
      sum(s.grp) over (partition by s.n order by s.dt) num,
      lead(s.dt,1) over (partition by s.n order by s.dt) - 1 ddt,
      count(distinct grp) over (partition by n) cnt
  from 
      stff_start_of_group s
)
select 
    n, 
    min(s1) keep (dense_rank first anyword by dt) s1,
    min(s2) keep (dense_rank first anyword by dt) s2,
    min(dt) start_dt,
    decode(max(cnt), 1, null, max(ddt)) end_dt
from 
    groups
group by
    n, num;
...
Рейтинг: 0 / 0
29.10.2020, 16:45
    #40013111
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна подсказка (Оконные функции)
ObserverZ
Добрый день, уважаемые форумчане!

Помогите составить запрос.

Есть таблица Table1 (пример)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Номер       Фамилия       Имя      Отчество       Дата
1             Иванов         Иван      Иванович      01.01.2000
1             Иванов         Иван      Иванович       02.01.2000 
1             Акимов         Иван      Иванович      04.01.2000
2             Петров         Петр       Петрович      04.01.2000
2             Петров         Петр       Петрович      07.01.2000
3             Сидоров       Сидор     Сидорович    08.01.2000

В итоге нужно получить таблицу вида:

Номер      Фамилия        Имя     Отчество     Начало          Конец
1             Иванов          Иван     Иванович    01.01.2020    03.01.2000 
1             Акимов          Иван     Иванович    04.01.2020    -
2             Петров          Петр      Петрович    04.01.2020    -
3             Сидоров        Сидор    Сидорович  08.01.2020    -

Объяснение: Поля Фамилия Имя Отчество могут меняться при одинаковом поле Номер. В итоговую таблицу в поле "Начало" должна попадать минимальная дата, в поле "Конец" - взять дату из строки изменения поля и вычесть 1 день . Если изменения полей не было - проставить null.

Набросок запроса:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT DISTINCT
            n,
            last_name,
            first_name,
            patronymic,
            min(date) over(partition by 
                n, 
                last_name, 
                first_name, 
                patronymic) as Nachalo,
            ???
FROM Table 1




Понимаю, что скорее всего нужно использовать lead(), но сообразить не могу.


Пример не совпадает с объяснением - я подчеркнул несоответствие. Может, "добавить один день" ?
Со "строкой изменения поля" неясно - вы наверное предполагаете "та, другая строка, которая не с минимальной датой".
Но таких "других" строк может быть несколько. Если вы уверены что "та, другая" - не более одной и отличается датой, то можно так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT
            n,
            last_name,
            first_name,
            patronymic,
            min(date) as Nachalo,
            nullif(max(date),min(date))+1 as EndDate
FROM Table1
GROUP BY n, last_name, first_name, patronymic
ORDER BY n, last_name, first_name, patronymic
...
Рейтинг: 0 / 0
29.10.2020, 16:48
    #40013112
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна подсказка (Оконные функции)
НеофитSQL
Пример не совпадает с объяснением - я подчеркнул несоответствие

ObserverZ
взять дату из строки изменения поля

Не из текущей строки. Из "следующей" [в диапазоне окна и по порядку его сортировки] строки, в которой есть изменение.
...
Рейтинг: 0 / 0
29.10.2020, 16:51
    #40013114
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна подсказка (Оконные функции)
НеофитSQL
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT
            n,
            last_name,
            first_name,
            patronymic,
            min(date) as Nachalo,
            nullif(max(date),min(date))+1 as EndDate
FROM Table1
GROUP BY n, last_name, first_name, patronymic
ORDER BY n, last_name, first_name, patronymic



Stax
для
1 Иванов Иван Иванович 01.01.2000
1 Иванов Иван Иванович 02.01.2000
1 Акимов Иван Иванович 04.01.2000
1 Иванов Иван Иванович 12.01.2000
1 Иванов Иван Иванович 14.01.2000


Вернёт хрень.
...
Рейтинг: 0 / 0
29.10.2020, 18:29
    #40013163
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна подсказка (Оконные функции)
Oracle 12+:
Код: 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.
with table1(n, last_name, first_name, patronymic, dt) as (
select 1, 'Ivanov' , 'Ivan' , 'Ivanovich' , to_date('01.01.2000','dd.mm.yyyy') from dual union all
select 1, 'Ivanov' , 'Ivan' , 'Ivanovich' , to_date('02.01.2000','dd.mm.yyyy') from dual union all
select 1, 'Akimov' , 'Ivan' , 'Ivanovich' , to_date('04.01.2000','dd.mm.yyyy') from dual union all
select 2, 'Petrov' , 'Petr' , 'Petrovich' , to_date('04.01.2000','dd.mm.yyyy') from dual union all
select 2, 'Petrov' , 'Petr' , 'Petrovich' , to_date('07.01.2000','dd.mm.yyyy') from dual union all
select 3, 'Sidorov', 'Sidor', 'Sidorovich', to_date('08.01.2000','dd.mm.yyyy') from dual 
)
select *
from table1
match_recognize
(
 partition by n
 order by dt
 measures
    last_name as last_name2, 
    first_name as first_name2, 
    patronymic as patronymic2,
    first(dt) as dt_first,
    last(dt) as dt_last,
    next(dt) as dt_next,
    next(dt)-1 as dt_close
 pattern (a b*)
 define
   b as b.last_name=prev(last_name) and b.first_name=prev(first_name) and b.patronymic=prev(patronymic)
);



https://dbfiddle.uk/?rdbms=oracle_18&fiddle=3d2786bb59fb57b114500cd3e6a7e12b
...
Рейтинг: 0 / 0
29.10.2020, 19:47
    #40013203
graycode
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна подсказка (Оконные функции)
ObserverZ,

Каким должен быть порядок записей? Сортировать сначала по номеру, потом по дате, потом по фио или сначала дата, потом номер, потом фио?
...
Рейтинг: 0 / 0
29.10.2020, 20:00
    #40013210
graycode
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна подсказка (Оконные функции)
ObserverZ,

Код: plsql
1.
2.
3.
Номер        Фамилия         Имя       Отчество         Дата       Дата + 1 день
1             Иванов         Иван      Иванович      01.01.2000    02.01.2000
1             Иванов         Иван      Иванович      02.01.2000    ...


13585258
...
Рейтинг: 0 / 0
29.10.2020, 20:28
    #40013218
graycode
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна подсказка (Оконные функции)
ups, не прочитал условия, синтетическую дату окончания интервала брать не +1 день, а lag со следующей записи.
...
Рейтинг: 0 / 0
29.10.2020, 22:29
    #40013253
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна подсказка (Оконные функции)
Первое и второе сообщение ТС исполняют разные алгоритмы.

Good luck.
...
Рейтинг: 0 / 0
30.10.2020, 00:56
    #40013293
graycode
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна подсказка (Оконные функции)
graycode

Адаптировал под условия задачи
Код: 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.
with table1(n, last_name, first_name, patronymic, dt) as ( 
select 1, 'Ivanov' , 'Ivan' , 'Ivanovich' , to_date('01.01.2000','dd.mm.yyyy') from dual union all 
select 1, 'Ivanov' , 'Ivan' , 'Ivanovich' , to_date('02.01.2000','dd.mm.yyyy') from dual union all 
select 1, 'Akimov' , 'Ivan' , 'Ivanovich' , to_date('04.01.2000','dd.mm.yyyy') from dual union all 
select 1, 'Ivanov' , 'Ivan' , 'Ivanovich' , to_date('12.01.2000','dd.mm.yyyy') from dual union all 
select 1, 'Ivanov' , 'Ivan' , 'Ivanovich' , to_date('14.01.2000','dd.mm.yyyy') from dual union all 
select 2, 'Petrov' , 'Petr' , 'Petrovich' , to_date('04.01.2000','dd.mm.yyyy') from dual union all 
select 2, 'Petrov' , 'Petr' , 'Petrovich' , to_date('07.01.2000','dd.mm.yyyy') from dual union all 
select 3, 'Sidorov', 'Sidor', 'Sidorovich', to_date('08.01.2000','dd.mm.yyyy') from dual  
) 
, t(n, last_name, first_name, patronymic, d1, d2) as ( 
select n, last_name, first_name, patronymic, dt 
     , coalesce(lead(dt) over (order by n, dt, last_name, first_name, patronymic) + 
                case when n || last_name || first_name || patronymic <>  
                          lead(n || last_name || first_name || patronymic) 
                          over (order by n, dt, last_name, first_name, patronymic) 
                     then - 1 else 0 end 
              , dt) 
from table1 
) 
select min(n) as n, min(last_name), min(first_name), min(patronymic) 
     , min(d1) as d1 
     , case when max(next_d1) <> max(d1) + 1 and max(next_d1) <> max(d1) 
            then max(d2) end as d2 
  from ( 
         select n, last_name, first_name, patronymic, d1, d2 
              , sum(sog) over(order by n, d1, d2) as grp_id 
              , case when lead(sog) over(order by n, d1, d2) = 1 
                     then lead(d1) over(order by n, d1, d2) end as next_d1 
           from ( 
                  select n, last_name, first_name, patronymic, d1 
                       , case when d2 < d1 then d1 else d2 end as d2 
                       , case when d1 <= max(d2) 
                                   over(partition by n  
                                        order by d1, d2 rows between unbounded preceding and 1 preceding)  
                              then 0 else 1 end as sog
                    from t 
                ) 
        ) 
 group by grp_id 
order by n, d1, d2
...
Рейтинг: 0 / 0
30.10.2020, 09:56
    #40013353
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна подсказка (Оконные функции)
graycode

Адаптировал под условия задачи


у него проще (нет пересечений)
дата уникальна

22223025

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

  1  with t(n, fio, dt) as (
  2  select 1, 'Ivanov Ivan Ivanovich' , to_date('01.01.2000','dd.mm.yyyy') from dual union all
  3  select 1, 'Ivanov Ivan Ivanovich' , to_date('02.01.2000','dd.mm.yyyy') from dual union all
  4  select 1, 'Akimov Ivan Ivanovich' , to_date('04.01.2000','dd.mm.yyyy') from dual union all
  5  select 1, 'Ivanov Ivan Ivanovich' , to_date('07.01.2000','dd.mm.yyyy') from dual union all
  6  select 1, 'Ivanov Ivan Ivanovich' , to_date('09.01.2000','dd.mm.yyyy') from dual union all
  7  select 1, 'Akimov Ivan Ivanovich' , to_date('14.01.2000','dd.mm.yyyy') from dual union all
  8  select 1, 'Akimov Ivan Ivanovich' , to_date('24.01.2000','dd.mm.yyyy') from dual union all
  9  --
 10  select 2, 'Petrov Petr Petrovich' , to_date('04.01.2000','dd.mm.yyyy') from dual union all
 11  select 2, 'Petrov Petr Petrovich' , to_date('07.01.2000','dd.mm.yyyy') from dual union all
 12  select 3, 'Sidorov Sidor Sidorovich', to_date('08.01.2000','dd.mm.yyyy') from dual
 13  )
 14  select
 15    n
 16   ,max(fio) fio
 17   ,min(dt) d_from
 18   ,lead(min(dt)) over (partition by n order by min(dt))-1 d_to from
 19   ( select t.*
 20     ,row_number() over (partition by n order by dt)-
 21      row_number() over (partition by n,fio order by dt) g
 22   from t)
 23* group by n,g
SQL> /

         N FIO                      D_FROM     D_TO
---------- ------------------------ ---------- ----------
         1 Ivanov Ivan Ivanovich    01.01.2000 03.01.2000
         1 Akimov Ivan Ivanovich    04.01.2000 06.01.2000
         1 Ivanov Ivan Ivanovich    07.01.2000 13.01.2000
         1 Akimov Ivan Ivanovich    14.01.2000
         2 Petrov Petr Petrovich    04.01.2000
         3 Sidorov Sidor Sidorovich 08.01.2000

6 rows selected.

SQL>



.....
stax
...
Рейтинг: 0 / 0
30.10.2020, 10:36
    #40013363
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна подсказка (Оконные функции)
graycode
graycode

Адаптировал под условия задачи


не скопировл
Код: 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.
with table1(n, last_name, first_name, patronymic, dt) as ( 
select 1, 'Ivanov' , 'Ivan' , 'Ivanovich' , to_date('01.01.2000','dd.mm.yyyy') from dual union all 
select 1, 'Ivanov' , 'Ivan' , 'Ivanovich' , to_date('02.01.2000','dd.mm.yyyy') from dual union all 
select 1, 'Akimov' , 'Ivan' , 'Ivanovich' , to_date('04.01.2000','dd.mm.yyyy') from dual union all 
select 1, 'Ivanov' , 'Ivan' , 'Ivanovich' , to_date('12.01.2000','dd.mm.yyyy') from dual union all 
select 1, 'Ivanov' , 'Ivan' , 'Ivanovich' , to_date('14.01.2000','dd.mm.yyyy') from dual union all 
select 1, 'Akimov' , 'Ivan' , 'Ivanovich' , to_date('15.01.2000','dd.mm.yyyy') from dual union all 
select 1, 'Akimov' , 'Ivan' , 'Ivanovich' , to_date('24.01.2000','dd.mm.yyyy') from dual union all 
select 2, 'Petrov' , 'Petr' , 'Petrovich' , to_date('04.01.2000','dd.mm.yyyy') from dual union all 
select 2, 'Petrov' , 'Petr' , 'Petrovich' , to_date('07.01.2000','dd.mm.yyyy') from dual union all 
select 3, 'Sidorov', 'Sidor', 'Sidorovich', to_date('08.01.2000','dd.mm.yyyy') from dual  
) 
...
 42   group by grp_id
 43* order by n, d1, d2
SQL> /

         N MIN(LAS MIN(F MIN(PATRON D1         D2
---------- ------- ----- ---------- ---------- ----------
         1 Ivanov  Ivan  Ivanovich  01.01.2000 03.01.2000
         1 Akimov  Ivan  Ivanovich  04.01.2000 11.01.2000
         1 Ivanov  Ivan  Ivanovich  12.01.2000
         1 Akimov  Ivan  Ivanovich  15.01.2000 24.01.2000
         2 Petrov  Petr  Petrovich  04.01.2000
         3 Sidorov Sidor Sidorovich 08.01.2000

6 rows selected.
...
Рейтинг: 0 / 0
30.10.2020, 14:10
    #40013433
graycode
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна подсказка (Оконные функции)
Stax
не скопировл

N MIN(LAS MIN(F MIN(PATRON D1 D2
---------- ------- ----- ---------- ---------- ----------
==> 1 Ivanov Ivan Ivanovich 12.01.2000
==> 1 Akimov Ivan Ivanovich 15.01.2000 24.01.2000
[/src]

Проще то понятно, конечно можно start of group получить более простым путем, но не интересно))

Что не нравится в приведенном фрагменте, вроде все как и хотел топикстартер, между 14 и 15 разрыва нет, поэтому d2 не выводится, между 15 и 04 мягко говоря нестыковка поэтому выводится, хотя можно и не выводить, там два примера слиты в один и есть наложение периодов, которого в исходной задаче нет, у топикстартера такой вариант скорее всего невозможен.
...
Рейтинг: 0 / 0
30.10.2020, 14:28
    #40013444
graycode
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна подсказка (Оконные функции)
Stax
у него проще (нет пересечений)
дата уникальна

Дата не уникальна и есть пересечение, правда неглубокое))
ObserverZ
1 Акимов Иван Иванович 04.01.2000
2 Петров Петр Петрович 04.01.2000
2 Петров Петр Петрович 07.01.2000
3 Сидоров Сидор Сидорович 08.01.2000
...
Рейтинг: 0 / 0
30.10.2020, 14:36
    #40013449
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна подсказка (Оконные функции)
graycode,

Поле Номер разное же, уникальность даты имеет смысл ожидать в пределах событий одного номера.
...
Рейтинг: 0 / 0
30.10.2020, 14:48
    #40013454
graycode
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна подсказка (Оконные функции)
env,

Требуется уточнение
ObserverZ

Номер Фамилия Имя Отчество Дата
1 Иванов Иван Иванович 01.01.2000
1 Иванов Иван Иванович 02.01.2000
1 Акимов Иван Иванович 04.01.2000
2 Петров Петр Петрович 04.01.2000
2 Петров Петр Петрович 07.01.2000
3 Сидоров Сидор Сидорович 08.01.2000

В итоге нужно получить таблицу вида:

Номер Фамилия Имя Отчество Начало Конец
1 Иванов Иван Иванович 01.01.2020 03.01.2000
1 Акимов Иван Иванович 04.01.2020 - пусто
2 Петров Петр Петрович 04.01.2020 - пусто
3 Сидоров Сидор Сидорович 08.01.2020 -

Пусто оно потому что номер сменился или потому что между 04 - 04 и 07 - 08 нет разрыва, я предполагал второй вариант, т.е. даты сквозные.
...
Рейтинг: 0 / 0
30.10.2020, 14:55
    #40013457
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна подсказка (Оконные функции)
graycode
Пусто оно потому что номер сменился

ObserverZ
Поля Фамилия Имя Отчество могут меняться при одинаковом поле Номер


Видимо, человек работает в ГРУ и ведёт список использованных агентами документов в привязке к табельному номеру, выбритому у сотрудника в укромном месте. Каждый документ с новым ФИО можно использовать строго с нового дня.

Ну или в банке ведут по ИНН клиентов, которые часто меняют фамилию, отчество и пол.
...
Рейтинг: 0 / 0
30.10.2020, 15:13
    #40013466
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна подсказка (Оконные функции)
graycode,


имхо
просто анализ "лога" (дирок нет)

Номер ето ИД записи
при изменении пишут все поля, а не только изменившееся с датой модификаци
хотят значение отрибута (фио) в формате Начало Конец (null действущее значение)

1 Иванов Иван Иванович 01.01.2000 -добавили строку
1 Иванов Иван Иванович 02.01.2000 -поменяли не ФИО, а напр оклад
1 Акимов Иван Иванович 04.01.2000 -поменялось ФИО и мож еще что-то
и тд

надо значение ФИО для 1 номера в формате Начало Конец

....
stax
...
Рейтинг: 0 / 0
30.10.2020, 15:15
    #40013467
graycode
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна подсказка (Оконные функции)
ObserverZ,

алгоритм через start of group выглядит так:
находим способ выделить записи с которых начинается каждая группа,
разбиваем по группам и группируем по ним.

n last_name first_name patronymic dt sog group (sum(sog)) lead(dt) *1 Ivanov Ivan Ivanovich 01.01.2000 1 1 1 Ivanov Ivan Ivanovich 02.01.2000 0 1 04.01.20001 Akimov Ivan Ivanovich 04.01.2000 1 2 04.01.20002 Petrov Petr Petrovich 04.01.2000 1 32 Petrov Petr Petrovich 07.01.2000 0 3 08.01.20003 Sidorov Sidor Sidorovich 08.01.2000 1 4

* дата из следующей записи для последней в группе записи, т.е. предшествующей началу следующей группы

Агрегированный результат
min(n) min(last_name) min(first_name) min(patronymic) "Начало" min(dt) max(dt) group max/min lead(dt) ** "Конец" ***1 Ivanov Ivan Ivanovich 01.01.2000 02.01.2000 1 04.01.2000 03.01.20001 Akimov Ivan Ivanovich 04.01.2000 04.01.2000 2 04.01.2000 2 Petrov Petr Petrovich 04.01.2000 07.01.2000 3 08.01.2000 3 Sidorov Sidor Sidorovich 08.01.2000 08.01.2000 4

** max/min для lead(dt) не важно, поскольку она одна на группу.

*** если между max(dt) и lead(dt) есть разрыв, то выводим в качестве второй даты lead(dt) - 1 иначе ничего не выводим
...
Рейтинг: 0 / 0
30.10.2020, 15:21
    #40013474
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна подсказка (Оконные функции)
graycode


*** если между max(dt) и lead(dt) есть разрыв, то выводим в качестве второй даты lead(dt) - 1 иначе ничего не выводим

Разрыв будет всегда, даты не повторяются (уникальны)

....
stax
...
Рейтинг: 0 / 0
30.10.2020, 15:23
    #40013477
graycode
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна подсказка (Оконные функции)
env, Stax,

Не знаю, топикстартеру виднее, на самом деле разница не сильно большая в реализации, событие для sog - смена номера или фио, считать даты разбитые по partition by n или же n будет в order by уже не сильно принципиально.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Нужна подсказка (Оконные функции) / 25 сообщений из 26, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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