powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Прошу помочь с составлением запроса.
7 сообщений из 7, страница 1 из 1
Прошу помочь с составлением запроса.
    #39903861
medium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеется: таблица подчиненности сотрудников:
employee_id - идентификатор сотрудника
manager_id - идентификатор руководителя
start_date_inclusive - начало интервала дат (включительно, дата начала входит в интервал)
end_date_exclusive - окончание интервала дат (исключительно, дата окончания не входит в интервал)
Код: 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.
WITH tree AS
 (SELECT 1 AS employee_id
        ,3 AS manager_id
        ,to_date('01.01.2019', 'DD.MM.YYYY') AS start_date_inclusive
        ,to_date('01.02.2019', 'DD.MM.YYYY') AS end_date_exclusive
    FROM dual
  UNION
  SELECT 2 AS employee_id
        ,4 AS manager_id
        ,to_date('16.01.2019', 'DD.MM.YYYY') AS start_date_inclusive
        ,to_date('16.02.2019', 'DD.MM.YYYY') AS end_date_exclusive
    FROM dual
  UNION
  SELECT 3 AS employee_id
        ,4 AS manager_id
        ,to_date('17.01.2019', 'DD.MM.YYYY') AS start_date_inclusive
        ,to_date('14.02.2019', 'DD.MM.YYYY') AS end_date_exclusive
    FROM dual
  UNION
  SELECT 4 AS employee_id
        ,1 AS manager_id
        ,to_date('17.01.2019', 'DD.MM.YYYY') AS start_date_inclusive
        ,to_date('01.03.2019', 'DD.MM.YYYY') AS end_date_exclusive
    FROM dual)
SELECT * FROM tree



Прошу помочь составить запрос, возвращающий записи с полями:
employee_id - идентификатор сотрудника
start_date_inclusive - начало интервала дат (включительно, дата начала входит в интервал)
end_date_exclusive - окончание интервала дат (исключительно, дата окончания не входит в интервал)

Записи должны для каждого сотрудника содержать интервалы дат, в течение которых набор руководителей (с учетом всей иерархии подчиненности) не менялся.
Если в течение интервала дат у сотрудника не было руководителя, запись выводить не требуется.
Должен получиться такой набор:

Код: 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.
SELECT *
  FROM (SELECT 1 employee_id
              ,to_date('01.01.2019', 'DD.MM.YYYY') AS start_date_inclusive
              ,to_date('17.01.2019', 'DD.MM.YYYY') AS end_date_exclusive
          FROM dual
        UNION
        SELECT 1 employee_id
              ,to_date('17.01.2019', 'DD.MM.YYYY') AS start_date_inclusive
              ,to_date('14.02.2019', 'DD.MM.YYYY') AS end_date_exclusive
          FROM dual
        UNION
        SELECT 2 employee_id
              ,to_date('16.01.2019', 'DD.MM.YYYY') AS start_date_inclusive
              ,to_date('16.02.2019', 'DD.MM.YYYY') AS end_date_exclusive
          FROM dual
        UNION
        SELECT 3 employee_id
              ,to_date('17.01.2019', 'DD.MM.YYYY') AS start_date_inclusive
              ,to_date('14.02.2019', 'DD.MM.YYYY') AS end_date_exclusive
          FROM dual
        UNION
        SELECT 4 employee_id
              ,to_date('17.01.2019', 'DD.MM.YYYY') AS start_date_inclusive
              ,to_date('01.03.2019', 'DD.MM.YYYY') AS end_date_exclusive
          FROM dual)


Предполагается, что переназначение руководителя происходит приблизительно один раз в 100 дней.
Сотрудников - 5000.
Интервал, на котором осуществляется выборка - 5 лет.

Большое спасибо.
...
Рейтинг: 0 / 0
Прошу помочь с составлением запроса.
    #39903887
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неправдоподобная херня в исходных данных.
Код: plsql
1.
2.
3.
4.
5.
 25  SELECT * FROM (select * from tree where date '2019-01-20' between start_date_inclusive and end_date_exclusive)
 26    connect by employee_id = prior manager_id
 27  ;
ERROR:
ORA-01436: CONNECT BY loop in user data
...
Рейтинг: 0 / 0
Прошу помочь с составлением запроса.
    #39903921
medium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приношу извинения, вкралась досадная ошибка
Код: 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.
WITH tree AS
 (SELECT 1 AS employee_id
        ,3 AS manager_id
        ,to_date('01.01.2019', 'DD.MM.YYYY') AS start_date_inclusive
        ,to_date('01.02.2019', 'DD.MM.YYYY') AS end_date_exclusive
    FROM dual
  UNION
  SELECT 2 AS employee_id
        ,4 AS manager_id
        ,to_date('16.01.2019', 'DD.MM.YYYY') AS start_date_inclusive
        ,to_date('16.02.2019', 'DD.MM.YYYY') AS end_date_exclusive
    FROM dual
  UNION
  SELECT 3 AS employee_id
        ,4 AS manager_id
        ,to_date('17.01.2019', 'DD.MM.YYYY') AS start_date_inclusive
        ,to_date('14.02.2019', 'DD.MM.YYYY') AS end_date_exclusive
    FROM dual
  UNION
  SELECT 4 AS employee_id
        ,1 AS manager_id
        ,to_date('17.02.2019', 'DD.MM.YYYY') AS start_date_inclusive
        ,to_date('01.03.2019', 'DD.MM.YYYY') AS end_date_exclusive
    FROM dual)
SELECT *
  FROM (SELECT *
          FROM tree
         WHERE to_date('20.01.2019', 'DD.MM.YYYY') >= start_date_inclusive
           AND to_date('20.01.2019', 'DD.MM.YYYY') < end_date_exclusive)
CONNECT BY employee_id = PRIOR manager_id



Спасибо за критику.
...
Рейтинг: 0 / 0
Прошу помочь с составлением запроса.
    #39903923
medium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
соответственно, результат выполнения должен быть такой:
Код: 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.
SELECT *
  FROM (SELECT 1 employee_id
              ,to_date('01.01.2019', 'DD.MM.YYYY') AS start_date_inclusive
              ,to_date('17.01.2019', 'DD.MM.YYYY') AS end_date_exclusive
          FROM dual
        UNION
        SELECT 1 employee_id
              ,to_date('17.01.2019', 'DD.MM.YYYY') AS start_date_inclusive
              ,to_date('14.02.2019', 'DD.MM.YYYY') AS end_date_exclusive
          FROM dual
        UNION
        SELECT 2 employee_id
              ,to_date('16.01.2019', 'DD.MM.YYYY') AS start_date_inclusive
              ,to_date('16.02.2019', 'DD.MM.YYYY') AS end_date_exclusive
          FROM dual
        UNION
        SELECT 3 employee_id
              ,to_date('17.01.2019', 'DD.MM.YYYY') AS start_date_inclusive
              ,to_date('14.02.2019', 'DD.MM.YYYY') AS end_date_exclusive
          FROM dual
        UNION
        SELECT 4 employee_id
              ,to_date('17.02.2019', 'DD.MM.YYYY') AS start_date_inclusive
              ,to_date('01.03.2019', 'DD.MM.YYYY') AS end_date_exclusive
          FROM dual)
...
Рейтинг: 0 / 0
Прошу помочь с составлением запроса.
    #39904019
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
medium
Спасибо за критику.
Выучи же date-литерал.
...
Рейтинг: 0 / 0
Прошу помочь с составлением запроса.
    #39904032
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
medium
Записи должны для каждого сотрудника содержать интервалы дат, в течение которых набор руководителей (с учетом всей иерархии подчиненности) не менялся.

  • Разбить на подынтервальчики.
  • Для точки в каждом подынтервальчике получить путь к руководителю
  • Хронологически неизменных руководителей объединить в одну группу (start_of_group или match_recognize)
...
Рейтинг: 0 / 0
Прошу помочь с составлением запроса.
    #39904159
medium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А собственные потуги свелись к двум идеям, пока не реализованным:
1. Во временной таблице рассчитывать даты правления руководителей очередного уровня и так по циклу добавлять записи, пока руководители не закончатся.
2. Благо все интервалы выравнены на границу дат, создать шкалу дат и рассчитывать sys_connect_by_path, потом оставить те даты, где sys_connect_by_path изменился по сравнению со вчерашней и получить результат.

Обязательно напишу, когда будет результат.

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


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