Тестовое задание SQL Oracle
SQL Oracle
Есть таблица с исходными данными в виде:
| user_id | user_position | date_position |
|---|---|---|
| 1 | 1 | 01.01.2019 |
| 1 | 1 | 02.01.2019 |
| 1 | 2 | 03.01.2019 |
| 1 | 2 | 04.01.2019 |
| 1 | 1 | 05.01.2019 |
| 1 | 1 | 06.01.2019 |
| 2 | 1 | 01.01.2019 |
| 2 | 1 | 02.01.2019 |
| 2 | 1 | 03.01.2019 |
| 2 | 2 | 04.01.2019 |
| 2 | 2 | 05.01.2019 |
| 2 | 2 | 08.01.2019 |
| 2 | 2 | 10.01.2019 |
user_id – идентификатор сотрудника; user_position - идентификатор присутствия (1 = присутствовал, 2 = отсутствовал) date_position - календарная дата
Необходимо вычислить непрерывный период (по date_position), как дату начала вхождения в позицию position_start и дату окончания вхождения в позицию position_end в рабочий день по каждому сотруднику и в разрезе user_position.
Период нахождения сотрудника в позиции считается непрерывным периодом, если увеличение дат позиции date_position на один день проходит без смены позиции и не имеются разрывы дат date_position(не рабочие дни)
Сотрудник не может занимать две позиции в один день(базовое условие уникальности данных в таблице users_position)
Результат отсортировать по сотруднику и дате начала вхождения в непрерывный период и предоставить в виде:
| user_id | user_position | position_start | position_end |
|---|---|---|---|
| 1 | 1 | 01.01.2019 | 02.01.2019 |
| 1 | 2 | 03.01.2019 | 03.01.2019 |
| 1 | 1 | 05.01.2019 | 06.01.2019 |
| 2 | 1 | 01.01.2019 | 03.01.2019 |
| 2 | 2 | 04.01.2019 | 05.01.2019 |
| 2 | 2 | 08.01.2019 | 08.01.2019 |
| 2 | 2 | 10.01.2019 | 10.01.2019 |
Пытаюсь использовать следующее:
SELECT user_id, user_position, MIN (date_position) dt_open, MAX (date_position) dt_close
FROM (
SELECT tt.*, SUM (chng) OVER (PARTITION BY user_id, user_position ORDER BY date_position ASC) rnk
FROM (
SELECT users_position.*,
CASE
WHEN COALESCE (
LAG (MAX (date_position)) OVER (PARTITION BY user_id, user_position ORDER BY date_position ASC),
date_position - 1) = (date_position - 1) THEN 0
ELSE 1 END chng
FROM users_position
) tt
) tt
GROUP BY user_id, user_position, rnk
ORDER BY user_position, dt_open
Но Oracle SQL Developer выдаёт ошибку:
ORA-00937: групповая функция не является одногруппной
00937. 00000 - "not a single-group group function"
*Cause:
*Action:
Error at Line: 5 Column: 31