|
Объединение интервалов дат в случае пересечения или соприкосновения этих интервалов.
|
|||
---|---|---|---|
#18+
Доброй ночи. Не могу режить задачу. Нужно написать запрос, который по интервалам объединит эти интервалы в случае если они пересекаются или граничат. Дано примерно так: CREATE TABLE Quest(start_date date, end_date date); INSERT INTO Quest VALUES('2020-01-01', '2020-01-15'); INSERT INTO Quest VALUES('2020-01-13', '2020-01-30'); INSERT INTO Quest VALUES('2020-02-01', '2020-02-05'); INSERT INTO Quest VALUES('2020-02-15', '2020-02-27'); INSERT INTO Quest VALUES('2020-02-16', '2020-02-19'); INSERT INTO Quest VALUES('2020-02-03', '2020-02-16'); INSERT INTO Quest VALUES('2020-03-01', '2020-05-04'); INSERT INTO Quest VALUES('2020-06-12', '2020-06-22'); INSERT INTO Quest VALUES('2020-04-17', '2020-06-19'); Результат должен быть: 2020-01-01, 2020-01-30 2020-02-01, 2020-02-27 2020-03-01, 2020-06-22 Думаю начало возможно такое: WITH RECURSIVE sub(sub_line, start_date) AS ( SELECT start_date, end_date FROM Quest ORDER BY start_date LIMIT 1 UNION ALL --Далее адекватных идей нет.-- SELECT sub_line FROM Quest q, sub s WHERE q.end_date >= s.start_date ) SELECT * FROM sub ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 01:16 |
|
Объединение интервалов дат в случае пересечения или соприкосновения этих интервалов.
|
|||
---|---|---|---|
#18+
Vladislav1987, определите наименее гранулярную единицу - шаг (сек,мин,год) смотрите насколько расходятся ближайшие точки в отсортированном списке, если больше чем единицу маркируйте как новый интервал(1,2,3), обыграйте краевые даты для каждого промаркированного Min и Max, все ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 01:41 |
|
Объединение интервалов дат в случае пересечения или соприкосновения этих интервалов.
|
|||
---|---|---|---|
#18+
yob Vladislav1987, определите наименее гранулярную единицу - шаг (сек,мин,год) смотрите насколько расходятся ближайшие точки в отсортированном списке, если больше чем единицу маркируйте как новый интервал(1,2,3), обыграйте краевые даты для каждого промаркированного Min и Max, все в вашем случае это просто день, с ним и работайте ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 02:11 |
|
Объединение интервалов дат в случае пересечения или соприкосновения этих интервалов.
|
|||
---|---|---|---|
#18+
yob, Добрый вечер. Сочинил вот это. Дальше снова ступор. SELECT * FROM ( SELECT SUB2.*, CASE WHEN end_date >= date_lagg OR start_date < date_leadd THEN 'per' ELSE 'no' END AS casee FROM ( SELECT SUB.*, start_date + lagg AS date_lagg, end_date - leadd AS date_leadd FROM (SELECT *, end_date - start_date AS diff, LAG((end_date - start_date), 1, 0) OVER(ORDER BY start_date) AS lagg, LEAD((end_date - start_date), 1, 0) OVER(ORDER BY start_date) AS leadd FROM Quest) AS SUB) AS SUB2) AS SUB3 --WHERE casee = 'per'-- ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 22:18 |
|
Объединение интервалов дат в случае пересечения или соприкосновения этих интервалов.
|
|||
---|---|---|---|
#18+
Vladislav1987, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Подсмотрено тут ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2021, 08:27 |
|
Объединение интервалов дат в случае пересечения или соприкосновения этих интервалов.
|
|||
---|---|---|---|
#18+
Щукина Анна, Огромное спасибо! Попытаюсь разобрать логику и шаги ответа. yob, Спасибо за участие. Сам за неимением опыта в SQL скорее всего запрос бы не написал. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2021, 21:01 |
|
Объединение интервалов дат в случае пересечения или соприкосновения этих интервалов.
|
|||
---|---|---|---|
#18+
Vladislav1987 Щукина Анна, Огромное спасибо! Попытаюсь разобрать логику и шаги ответа. yob, Спасибо за участие. Сам за неимением опыта в SQL скорее всего запрос бы не написал. Плохая практика писать множество вложенных запросов - дебажить тяжело. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2021, 23:03 |
|
Объединение интервалов дат в случае пересечения или соприкосновения этих интервалов.
|
|||
---|---|---|---|
#18+
yob Плохая практика писать множество вложенных запросов - дебажить тяжело. А как по другому? Вообще как раз вложенные позволяют нормально по отдельности их отладить проверяя каждую стадию. Как раз Анна написала идеально почти даже с т.з. моего весьма придирчивого взгляда. Все бы так писали. PS: Анна а вы мои emails видели вообще? -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2021, 00:04 |
|
|
start [/forum/topic.php?fid=53&fpage=13&tid=1994108]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
28ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
2ms |
others: | 300ms |
total: | 413ms |
0 / 0 |