|
Нужна подсказка (Оконные функции)
|
|||
---|---|---|---|
#18+
Добрый день, уважаемые форумчане! Помогите составить запрос. Есть таблица 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.
Понимаю, что скорее всего нужно использовать lead(), но сообразить не могу. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2020, 15:53 |
|
Нужна подсказка (Оконные функции)
|
|||
---|---|---|---|
#18+
ObserverZ, для 1 Иванов Иван Иванович 01.01.2000 1 Иванов Иван Иванович 02.01.2000 1 Акимов Иван Иванович 04.01.2000 1 Иванов Иван Иванович 12.01.2000 1 Иванов Иван Иванович 14.01.2000 что ? ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2020, 16:03 |
|
Нужна подсказка (Оконные функции)
|
|||
---|---|---|---|
#18+
ObserverZ, stff start_of_group ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2020, 16:10 |
|
Нужна подсказка (Оконные функции)
|
|||
---|---|---|---|
#18+
Stax, 1 Иванов Иван Иванович 01.01.2020 03.01.2000 1 Акимов Иван Иванович 04.01.2020 11.01.2000 1 Иванов Иван Иванович 12.01.2020 - ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2020, 16:17 |
|
Нужна подсказка (Оконные функции)
|
|||
---|---|---|---|
#18+
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.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2020, 16:25 |
|
Нужна подсказка (Оконные функции)
|
|||
---|---|---|---|
#18+
ObserverZ Добрый день, уважаемые форумчане! Помогите составить запрос. Есть таблица Table1 (пример) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Объяснение: Поля Фамилия Имя Отчество могут меняться при одинаковом поле Номер. В итоговую таблицу в поле "Начало" должна попадать минимальная дата, в поле "Конец" - взять дату из строки изменения поля и вычесть 1 день . Если изменения полей не было - проставить null. Набросок запроса: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Понимаю, что скорее всего нужно использовать lead(), но сообразить не могу. Пример не совпадает с объяснением - я подчеркнул несоответствие. Может, "добавить один день" ? Со "строкой изменения поля" неясно - вы наверное предполагаете "та, другая строка, которая не с минимальной датой". Но таких "других" строк может быть несколько. Если вы уверены что "та, другая" - не более одной и отличается датой, то можно так: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2020, 16:45 |
|
Нужна подсказка (Оконные функции)
|
|||
---|---|---|---|
#18+
НеофитSQL Пример не совпадает с объяснением - я подчеркнул несоответствие ObserverZ взять дату из строки изменения поля Не из текущей строки. Из "следующей" [в диапазоне окна и по порядку его сортировки] строки, в которой есть изменение. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2020, 16:48 |
|
Нужна подсказка (Оконные функции)
|
|||
---|---|---|---|
#18+
НеофитSQL Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Stax для 1 Иванов Иван Иванович 01.01.2000 1 Иванов Иван Иванович 02.01.2000 1 Акимов Иван Иванович 04.01.2000 1 Иванов Иван Иванович 12.01.2000 1 Иванов Иван Иванович 14.01.2000 Вернёт хрень. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2020, 16:51 |
|
Нужна подсказка (Оконные функции)
|
|||
---|---|---|---|
#18+
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.
https://dbfiddle.uk/?rdbms=oracle_18&fiddle=3d2786bb59fb57b114500cd3e6a7e12b ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2020, 18:29 |
|
Нужна подсказка (Оконные функции)
|
|||
---|---|---|---|
#18+
ObserverZ, Каким должен быть порядок записей? Сортировать сначала по номеру, потом по дате, потом по фио или сначала дата, потом номер, потом фио? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2020, 19:47 |
|
Нужна подсказка (Оконные функции)
|
|||
---|---|---|---|
#18+
ObserverZ, Код: plsql 1. 2. 3.
13585258 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2020, 20:00 |
|
Нужна подсказка (Оконные функции)
|
|||
---|---|---|---|
#18+
ups, не прочитал условия, синтетическую дату окончания интервала брать не +1 день, а lag со следующей записи. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2020, 20:28 |
|
Нужна подсказка (Оконные функции)
|
|||
---|---|---|---|
#18+
Первое и второе сообщение ТС исполняют разные алгоритмы. Good luck. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2020, 22:29 |
|
Нужна подсказка (Оконные функции)
|
|||
---|---|---|---|
#18+
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.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2020, 00:56 |
|
Нужна подсказка (Оконные функции)
|
|||
---|---|---|---|
#18+
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.
..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2020, 09:56 |
|
Нужна подсказка (Оконные функции)
|
|||
---|---|---|---|
#18+
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.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2020, 10:36 |
|
Нужна подсказка (Оконные функции)
|
|||
---|---|---|---|
#18+
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 мягко говоря нестыковка поэтому выводится, хотя можно и не выводить, там два примера слиты в один и есть наложение периодов, которого в исходной задаче нет, у топикстартера такой вариант скорее всего невозможен. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2020, 14:10 |
|
Нужна подсказка (Оконные функции)
|
|||
---|---|---|---|
#18+
Stax у него проще (нет пересечений) дата уникальна Дата не уникальна и есть пересечение, правда неглубокое)) ObserverZ 1 Акимов Иван Иванович 04.01.2000 2 Петров Петр Петрович 04.01.2000 2 Петров Петр Петрович 07.01.2000 3 Сидоров Сидор Сидорович 08.01.2000 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2020, 14:28 |
|
Нужна подсказка (Оконные функции)
|
|||
---|---|---|---|
#18+
graycode, Поле Номер разное же, уникальность даты имеет смысл ожидать в пределах событий одного номера. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2020, 14:36 |
|
Нужна подсказка (Оконные функции)
|
|||
---|---|---|---|
#18+
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 нет разрыва, я предполагал второй вариант, т.е. даты сквозные. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2020, 14:48 |
|
Нужна подсказка (Оконные функции)
|
|||
---|---|---|---|
#18+
graycode Пусто оно потому что номер сменился ObserverZ Поля Фамилия Имя Отчество могут меняться при одинаковом поле Номер Видимо, человек работает в ГРУ и ведёт список использованных агентами документов в привязке к табельному номеру, выбритому у сотрудника в укромном месте. Каждый документ с новым ФИО можно использовать строго с нового дня. Ну или в банке ведут по ИНН клиентов, которые часто меняют фамилию, отчество и пол. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2020, 14:55 |
|
Нужна подсказка (Оконные функции)
|
|||
---|---|---|---|
#18+
graycode, имхо просто анализ "лога" (дирок нет) Номер ето ИД записи при изменении пишут все поля, а не только изменившееся с датой модификаци хотят значение отрибута (фио) в формате Начало Конец (null действущее значение) 1 Иванов Иван Иванович 01.01.2000 -добавили строку 1 Иванов Иван Иванович 02.01.2000 -поменяли не ФИО, а напр оклад 1 Акимов Иван Иванович 04.01.2000 -поменялось ФИО и мож еще что-то и тд надо значение ФИО для 1 номера в формате Начало Конец .... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2020, 15:13 |
|
Нужна подсказка (Оконные функции)
|
|||
---|---|---|---|
#18+
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 иначе ничего не выводим ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2020, 15:15 |
|
Нужна подсказка (Оконные функции)
|
|||
---|---|---|---|
#18+
graycode *** если между max(dt) и lead(dt) есть разрыв, то выводим в качестве второй даты lead(dt) - 1 иначе ничего не выводим Разрыв будет всегда, даты не повторяются (уникальны) .... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2020, 15:21 |
|
Нужна подсказка (Оконные функции)
|
|||
---|---|---|---|
#18+
env, Stax, Не знаю, топикстартеру виднее, на самом деле разница не сильно большая в реализации, событие для sog - смена номера или фио, считать даты разбитые по partition by n или же n будет в order by уже не сильно принципиально. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2020, 15:23 |
|
|
start [/forum/topic.php?desktop=1&fid=52&tid=1880756]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
59ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
others: | 281ms |
total: | 440ms |
0 / 0 |