|
Добавить недостающие периоды
|
|||
---|---|---|---|
#18+
Есть таблица, с данными об отпусках и больничных (Таблица №1) Нужно получить итоговую таблицу за год (как пример 2017) с вставкой периодов работы, т.е. дополнить промежуточные периоды (Таблица №2). Т.е. добавится период до первого отпуска (если отпуск не начался 01.01.2017) и между периодами отсутствия. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2018, 12:59 |
|
Добавить недостающие периоды
|
|||
---|---|---|---|
#18+
Версия сервера? LEAD/LAG понимает? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2018, 13:01 |
|
Добавить недостающие периоды
|
|||
---|---|---|---|
#18+
undll, разверни интервалы в точки. затем из точек снова собери интервалы, но уже правильные, с недостающими периодами работоспособности... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2018, 13:06 |
|
Добавить недостающие периоды
|
|||
---|---|---|---|
#18+
AkinaВерсия сервера? LEAD/LAG понимает? 2008 R2, как я понимаю там нету LEAD'а ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2018, 13:29 |
|
Добавить недостающие периоды
|
|||
---|---|---|---|
#18+
undll, зато есть outer apply и CTE (но CTE тут нужно исключительно для декомпозиции и упрощения исходного запроса) ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2018, 13:31 |
|
Добавить недостающие периоды
|
|||
---|---|---|---|
#18+
Ну тогда самое простое решение - озвучено. Только при разборке обязательно пометить точки - где начало, а где конец отрезка. Перед сборкой - добавить точки начала и конца целевого периода, а после сборки - удалить интервалы нулевой длины. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2018, 13:32 |
|
Добавить недостающие периоды
|
|||
---|---|---|---|
#18+
Akina, на самом деле всё еще проще - достаточно получить УНИКАЛЬНЫЙ набор точек, без дублей. Далее - собрать точки в новые интервалы. Для определения типа интервала (пил/курил/болел) - пересечь левым джойном с исходными диапазонами... Что не найдет себе пересечения - то периоды работоспособности ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2018, 13:38 |
|
Добавить недостающие периоды
|
|||
---|---|---|---|
#18+
Добрый Э - Эх, единственное, что нужно будет ввести "мнимую" начальную точку, которая будет предшествовать всем рассматриваемым интервалам отсутствия человека на работе... Чтобы первый интервал работоспособности собрать правильно... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2018, 13:41 |
|
Добавить недостающие периоды
|
|||
---|---|---|---|
#18+
Код: sql 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2018, 14:13 |
|
Добавить недостающие периоды
|
|||
---|---|---|---|
#18+
Kopelly, огромное спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2018, 14:19 |
|
Добавить недостающие периоды
|
|||
---|---|---|---|
#18+
undll, так правильнее (в предыдущем вылазил интервал работы c 02.09.2018 по NULL) Код: sql 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2018, 14:24 |
|
Добавить недостающие периоды
|
|||
---|---|---|---|
#18+
Kopelly, Много лишнего. Можно проще. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2018, 14:26 |
|
Добавить недостающие периоды
|
|||
---|---|---|---|
#18+
Kopelly, там в 1 отпуске опечатка, период 05.03.2017 - 19.03 .2017 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2018, 14:27 |
|
Добавить недостающие периоды
|
|||
---|---|---|---|
#18+
Добрый Э - ЭхKopelly, Много лишнего. Можно проще. С удовольствием посмотрел бы на более красивое и оптимальное решение (без сарказма). ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2018, 14:30 |
|
Добавить недостающие периоды
|
|||
---|---|---|---|
#18+
undllKopelly, там в 1 отпуске опечатка, период 05.03.2017 - 19.03 .2017 Я специально изменил периоды, чтобы были пересекающиеся и выходящие за рамки года. Для твоих данных смотри заполнение таблицы @t из первого скрипта. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2018, 14:32 |
|
Добавить недостающие периоды
|
|||
---|---|---|---|
#18+
Kopellyтак правильнее Код: sql 1. 2. 3.
Попробуй управляющие конструкции: ==> (для подсветки строки жёлтым) >>> <<< (для подсветки нескольких символов в строке) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2018, 14:55 |
|
Добавить недостающие периоды
|
|||
---|---|---|---|
#18+
Kopelly (без сарказма). теперь уже завтра . Сегодня рабочий день закончился.... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2018, 14:58 |
|
Добавить недостающие периоды
|
|||
---|---|---|---|
#18+
Как уже сказали: "разверни интервалы в точки. затем из точек снова собери интервалы, но уже правильные, с недостающими периодами работоспособности... " Код: sql 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.
Результат: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2018, 15:47 |
|
Добавить недостающие периоды
|
|||
---|---|---|---|
#18+
LEAD и LAG для слабаков! Код: sql 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. 42. 43. 44. 45. 46. 47. 48. 49. 50.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2018, 15:58 |
|
Добавить недостающие периоды
|
|||
---|---|---|---|
#18+
Wlr-l, Под «разверни» таки подразумевалось именно что - «разверни», а не «сгенерируй все даты в заданном диапазоне». То есть, любой отрезок из исходного набора данных даст две точки : «начало» и «кончало». Вот и нужно пересобрать в новые интервалы... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2018, 16:18 |
|
Добавить недостающие периоды
|
|||
---|---|---|---|
#18+
Руслан Дамирович, Наверно, ДА, для слабаков. Например, если взять такую строку исходных данных Код: sql 1.
Получим Код: plaintext 1. 2. 3. 4.
Т.е. имеем проблему на границе периода. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2018, 16:20 |
|
Добавить недостающие периоды
|
|||
---|---|---|---|
#18+
Добрый Э - Эх, Согласен. Неточность в терминологии. Будем считать, что я просто привел вариант решения. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2018, 16:24 |
|
Добавить недостающие периоды
|
|||
---|---|---|---|
#18+
Wlr-lРуслан Дамирович, Наверно, ДА, для слабаков. Например, если взять такую строку исходных данных Код: sql 1.
Получим Код: plaintext 1. 2. 3. 4.
Т.е. имеем проблему на границе периода. "если вы понимаете, о чем я..."(с) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2018, 16:39 |
|
Добавить недостающие периоды
|
|||
---|---|---|---|
#18+
Добрый Э - Эх, у меня тоже заканчивается рабочий день. Приведу еще один пример, разворота интервалов в точки: Код: sql 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.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Описание периода ТС добавит. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2018, 17:31 |
|
Добавить недостающие периоды
|
|||
---|---|---|---|
#18+
Wlr-lРуслан Дамирович, Например, если взять такую строку исходных данных Код: sql 1.
Получим Код: plaintext 1. 2. 3. 4.
Проблемы нет. Достаточно добавить пару условий. Ваше решение универсальное, мое - в лоб. Я бы тоже решил его в виде HCTE, но зачем? :) авторСказочноЕ бали! :) И все же, остров, а значит м.р. - сказочный. Но мы все понимаем, что же там происходило ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2018, 17:39 |
|
|
start [/forum/topic.php?fid=46&msg=39589151&tid=1686338]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
32ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 321ms |
total: | 448ms |
0 / 0 |