Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Подсчёт уникального количества дней в таблице с диапазонами дат
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Пытаюсь найти решение для одной задачки: есть таблица, содержащая Имя, дату начала интервала и дату конца интервала. Суть в том, что у человека с одним и тем же именем - может быть несколько записей, в которых даты могут пересекаться (собственно фото) Нужно найти для каждого человека (в данном случае для одного Петрова) количество уникальных дней за все даты. То есть не учитывать наложение дат... Если суммарное количество дней найти по всем записям элементарно - например Код: sql 1. или Код: sql 1. 2. 3. 4. 5. то как исключить наложения я не додумался. Если есть добрые люди - поделитесь идеей, пожалуйста. Сам код таблицы Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2018, 00:33 |
|
||
|
Подсчёт уникального количества дней в таблице с диапазонами дат
|
|||
|---|---|---|---|
|
#18+
Отсортируй по дате начала периода. Отнимай start_date от end_date предыдущей записи. Если результат отрицательный, отнимай его от той суммы, которую получил "элементарно" ранее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2018, 02:34 |
|
||
|
Подсчёт уникального количества дней в таблице с диапазонами дат
|
|||
|---|---|---|---|
|
#18+
Вру. не будет работать. периоды переплетаются ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2018, 04:16 |
|
||
|
Подсчёт уникального количества дней в таблице с диапазонами дат
|
|||
|---|---|---|---|
|
#18+
Посмотри в поиске "пересечение периодов" часто подобная задача всплывает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2018, 04:27 |
|
||
|
Подсчёт уникального количества дней в таблице с диапазонами дат
|
|||
|---|---|---|---|
|
#18+
Поскольку количество пересекающихся периодов неизвестно заранее и не ограничено формально ничем, решение может быть только рекурсивным. Если версия сервера - 8, то там есть рекурсивные СТЕ, и задача элементарна. Если нет - то придётся делать псевдорекурсию. На отсортированной по ФИО и началу интервала таблице в подзапросе двумя переменными тащить текущие начало и конец объединённого периода.А в основном запросе группировать и брать максимальное время окончания. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2018, 07:35 |
|
||
|
Подсчёт уникального количества дней в таблице с диапазонами дат
|
|||
|---|---|---|---|
|
#18+
Ну можно создать отдельную таблицу, где будут все даты с минимального начала, по максимальный конец. Пометить там используемые периоды, а потом сформировать периоды из неё. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2018, 08:04 |
|
||
|
Подсчёт уникального количества дней в таблице с диапазонами дат
|
|||
|---|---|---|---|
|
#18+
magway_minsk, у вас - классическая задача на "островки". Решается через два вложенных подзапроса с [not] exists предикатом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2018, 08:59 |
|
||
|
Подсчёт уникального количества дней в таблице с диапазонами дат
|
|||
|---|---|---|---|
|
#18+
magway_minsk, Словесное описание алгоритма действий: 1) Для каждого пользователя объединяем все маленькие пересекающие между собой интервалы в сплошные не пересекающиеся между собой "мегаинтервалы" 2) Для каждого пользователя определяем длительность каждого полученного "мегаинтервала" 3) Для каждого пользователя определяем сумму длительностей всех "мегаинтервалов" Пример реализации: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2018, 09:37 |
|
||
|
Подсчёт уникального количества дней в таблице с диапазонами дат
|
|||
|---|---|---|---|
|
#18+
Есть еще пара вариантов. Один подсказал пользователь стэка: Код: sql 1. 2. 3. 4. 5. 6. 7. Код: sql 1. 2. 3. 4. Второй родил я. не самый крутой , вообще не крутой, но зато сам)) Код: 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. Теперь вызов: Код: sql 1. Спасибо всем кто откликнулся! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2018, 11:49 |
|
||
|
Подсчёт уникального количества дней в таблице с диапазонами дат
|
|||
|---|---|---|---|
|
#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. 34. 35. 36. 37. 38. 39. 40. 41. 42. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2018, 17:26 |
|
||
|
Подсчёт уникального количества дней в таблице с диапазонами дат
|
|||
|---|---|---|---|
|
#18+
982183Ну можно создать отдельную таблицу, где будут все даты с минимального начала, по максимальный конец. Пометить там используемые периоды, а потом сформировать периоды из неё.Я бы тоже на основе опорной таблицы-календаря сделал. Только не метить в ней ничего, а сджойнить и сделать COUNT(DISTINCT дата). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2018, 22:00 |
|
||
|
|

start [/forum/topic.php?fid=47&tid=1829792]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
45ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
2ms |
| others: | 236ms |
| total: | 377ms |

| 0 / 0 |
