Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужна подсказка, Оконные функции 
:(
    Опции темы
Zzz
Дата 29.10.2020, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 306
Регистрация: 21.2.2003
Где: Мурманск

Репутация: нет
Всего: 5



Добрый день, уважаемые форумчане!

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

Есть таблица 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.

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

Код

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(), но сообразить не могу.

Синтаксис Oracle.




Это сообщение отредактировал(а) Zzz - 29.10.2020, 15:41


--------------------
Бесполезной громоздкой надстройкой является Windows от Майкрософт. Она занимает 1Мб памяти диска и рассчитана на использование устройства типа мышь.

"ЭВМ в инженерной практике" М. 1989г.
PM MAIL ICQ   Вверх
Akina
Дата 30.10.2020, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 453



Вот как это выглядит в MySQL:

Код

WITH 
cte1 AS 
( SELECT Номер, 
         Фамилия, 
         Имя, 
         Отчество, 
         Дата,
         ROW_NUMBER() OVER (PARTITION BY Номер ORDER BY Дата) 
         - ROW_NUMBER() OVER (PARTITION BY Номер, Фамилия, Имя, Отчество ORDER BY Дата) grp
  FROM test ),
cte2 AS 
( SELECT Номер, Фамилия, Имя, Отчество, MIN(Дата) Начало, grp
  FROM cte1
  GROUP BY Номер, Фамилия, Имя, Отчество, grp )
SELECT *, LEAD(Начало) OVER (PARTITION BY Номер ORDER BY Начало) - INTERVAL 1 DAY Конец
FROM cte2
ORDER BY Номер, Начало

fiddle
В Оракле будет всё то же самое, возможно, кроме "минус 1 день". Ну и не забыть квотирование кириллических имён полей и алиасов.

Исходные данные я немного расширил для проверки возможных вариаций.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0998 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.