|
Нахождение мин. и макс. дат вхождения в диапазон
|
|||
---|---|---|---|
#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.
В результате ожидаемо получаю ElementDTSDTEA2019-12-12 05:00:00.0002019-12-12 05:15:00.000 Ожидаемый результат: ElementDTSDTEA2019-12-12 05:00:00.0002019-12-12 05:09:00.000 A2019-12-12 05:12:00.0002019-12-12 05:15:00.000 С одной стороны можно было бы создать курсор и пробежаться по отсортированной по Element и DTS таблице и определить наличие вхождений текущих записей в предыдущие, но это какой-то кривой способ получается и при наличии 20+К записей будет достаточно долгим. Можно ли получить желаемое без использования курсора? Подскажите, пожалуйста. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2019, 10:24 |
|
Нахождение мин. и макс. дат вхождения в диапазон
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2019, 10:47 |
|
Нахождение мин. и макс. дат вхождения в диапазон
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2019, 11:17 |
|
Нахождение мин. и макс. дат вхождения в диапазон
|
|||
---|---|---|---|
#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.
В итоге должно получиться 5 строчек: A 0 2019-12-12 05:00:00.000 2019-12-12 05:09:00.000A 2 2019-12-12 05:11:00.000 2019-12-12 05:15:00.000B 4 2019-12-12 05:10:00.000 2019-12-12 05:18:00.000B 5 2019-12-12 05:17:00.000 2019-12-12 05:29:00.000C 1 2019-12-12 05:00:00.000 2019-12-12 05:05:00.000 но сейчас выходит 6 A 0 2019-12-12 05:00:00.000 2019-12-12 05:05:00.000A 1 2019-12-12 05:02:00.000 2019-12-12 05:09:00.000A 2 2019-12-12 05:11:00.000 2019-12-12 05:15:00.000B 4 2019-12-12 05:10:00.000 2019-12-12 05:18:00.000B 5 2019-12-12 05:17:00.000 2019-12-12 05:29:00.000C 1 2019-12-12 05:00:00.000 2019-12-12 05:05:00.000 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2019, 17:08 |
|
Нахождение мин. и макс. дат вхождения в диапазон
|
|||
---|---|---|---|
#18+
Kast2K, порядок строк определяет выражение сортировки и больше ничто. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2019, 17:38 |
|
Нахождение мин. и макс. дат вхождения в диапазон
|
|||
---|---|---|---|
#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.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2019, 18:47 |
|
Нахождение мин. и макс. дат вхождения в диапазон
|
|||
---|---|---|---|
#18+
Remind, нет гарантии, что в очередном вхождении не будет существовать вложенного интервала дат в один из существующих d(s,e)=(1,9),(4,5). Если докинуть логически непротиворечивых данных(s<=e) на подобие следующих: Код: sql 1. 2. 3. 4. 5. 6.
То в таком случае последний запрос возвращает некорректные данные. (В наличии пересечение интервала + вложенный). Вот что у меня получилось: Код: 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.
Нейминг стилем автора))) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2019, 01:50 |
|
Нахождение мин. и макс. дат вхождения в диапазон
|
|||
---|---|---|---|
#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. 43. 44. 45. 46. 47.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2019, 04:26 |
|
Нахождение мин. и макс. дат вхождения в диапазон
|
|||
---|---|---|---|
#18+
nullin, Достаточно добавить DateEnd в ORDER BY: Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2019, 13:20 |
|
Нахождение мин. и макс. дат вхождения в диапазон
|
|||
---|---|---|---|
#18+
Remind, Решение не работает insert into @t (Element,DateBegin,DateEnd) values ('A', '1753-12-12 05:00:00', '2050-12-12 05:05:00'), --- *** ('A', '2019-12-12 05:00:00', '2019-12-12 05:05:00'), ('A', '2019-12-12 05:02:00', '2019-12-12 05:07:00'), ('A', '2019-12-12 05:03:00', '2019-12-12 05:09:00'), ('A', '2019-12-12 05:11:00', '2019-12-12 05:15:00'), ('B', '1753-12-12 05:00:00', '2050-12-12 05:05:00') --- *** ,('B', '2019-12-12 05:10:00', '2019-12-12 05:18:00') ,('B', '2019-12-12 05:17:00', '2019-12-12 05:19:00') ,('B', '2019-12-12 05:27:00', '2019-12-12 05:29:00') ,('C', '1753-12-12 05:00:00', '2050-12-12 05:05:00') --- *** ,('C', '2019-12-12 05:00:00', '2019-12-12 05:05:00') ,('C', '2019-12-12 05:01:00', '2019-12-12 05:05:00') ,('C', '2019-12-12 05:02:00', '2019-12-12 05:05:00') ,('C', '2019-12-12 05:03:00', '2019-12-12 05:05:00') ,('C', '2019-12-12 05:04:00', '2019-12-12 05:08:00') ,('C', '2019-12-12 05:04:00', '2019-12-12 05:07:00') ,('C', '2019-12-12 05:04:00', '2019-12-12 05:06:00') ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2019, 15:04 |
|
Нахождение мин. и макс. дат вхождения в диапазон
|
|||
---|---|---|---|
#18+
3unknown, ??? insert into @t (Element,DTS,DTE) values ('A', '1753-12-12 05:00:00', '2030-12-12 05:05:00'), -- *** ('A', '2019-12-12 05:00:00', '2019-12-12 05:05:00'), ('A', '2019-12-12 05:02:00', '2019-12-12 05:07:00'), ('A', '2019-12-12 05:03:00', '2019-12-12 05:09:00'), ('A', '2019-12-12 05:11:00', '2019-12-12 05:15:00') ,('B', '1753-12-12 05:10:00', '2030-12-12 05:18:00') -- *** ,('B', '2019-12-12 05:10:00', '2019-12-12 05:18:00') ,('B', '2019-12-12 05:17:00', '2019-12-12 05:19:00') ,('B', '2019-12-12 05:27:00', '2019-12-12 05:29:00') ,('C', '2019-12-12 05:00:00', '2019-12-12 05:05:00') ,('C', '1753-12-12 05:00:00', '2030-12-12 05:05:00') -- *** ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2019, 15:06 |
|
Нахождение мин. и макс. дат вхождения в диапазон
|
|||
---|---|---|---|
#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. 43.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2019, 15:54 |
|
Нахождение мин. и макс. дат вхождения в диапазон
|
|||
---|---|---|---|
#18+
Kast2K, вы поясните, случай, который я охарактеризовал у вас возможен? Если - да, то запрос 3unknown, тоже нерабочий, потому что здесь уже шаблонное решение требует учета дополнительных условий. Почему у unknown не работает - читая по диагонали не понятно, надо разбираться. Кинул все предложенные варианты(последние) на dbfiddle ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2019, 15:55 |
|
Нахождение мин. и макс. дат вхождения в диапазон
|
|||
---|---|---|---|
#18+
invm, insert into @t (Element,DateBegin,DateEnd) values ('A', '2019-12-12 04:59:59', '2019-12-12 05:19:01'), -- ** ('A', '2019-12-12 05:00:00', '2019-12-12 05:05:00'), ('A', '2019-12-12 05:02:00', '2019-12-12 05:07:00'), ('A', '2019-12-12 05:03:00', '2019-12-12 05:09:00'), ('A', '2019-12-12 05:11:00', '2019-12-12 05:15:00'), ('A', '2019-12-12 05:14:00', '2019-12-12 05:19:00') ,('B', '2019-12-12 05:10:00', '2019-12-12 05:18:00') ,('B', '2019-12-12 05:17:00', '2019-12-12 05:19:00') ,('B', '2019-12-12 05:27:00', '2019-12-12 05:29:00') ,('C', '2019-12-12 05:00:00', '2019-12-12 05:05:00'); ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2019, 15:57 |
|
Нахождение мин. и макс. дат вхождения в диапазон
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2019, 15:59 |
|
Нахождение мин. и макс. дат вхождения в диапазон
|
|||
---|---|---|---|
#18+
entrypoint, Пятница :( Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2019, 16:02 |
|
Нахождение мин. и макс. дат вхождения в диапазон
|
|||
---|---|---|---|
#18+
Добрый день! хочу сразу оговориться, что сервер 2008 (стыжусь, что не указал сразу) и не все предложенные варианты на нем стартуют. Обнаруженные проблемы при таком представлении данных (настоящие): A541 2019-12-18 10:55:24.627 2019-12-18 11:14:44.710 1A541 2019-12-18 10:56:44.623 2019-12-18 11:15:25.733 2A541 2019-12-18 10:59:25.163 2019-12-18 11:18:04.990 3A541 2019-12-18 11:02:05.350 2019-12-18 11:20:45.003 4A541 2019-12-18 11:04:44.793 2019-12-18 11:23:24.670 5A541 2019-12-18 11:07:24.960 2019-12-18 11:26:05.327 6A541 2019-12-18 11:10:04.913 2019-12-18 11:28:45.030 7A541 2019-12-18 11:12:45.313 2019-12-18 11:31:24.917 8A541 2019-12-18 15:33:24.340 2019-12-18 15:52:04.523 9A541 2019-12-18 15:36:44.180 2019-12-18 15:55:24.620 10A541 2019-12-18 15:40:04.193 2019-12-18 15:59:24.637 11A541 2019-12-18 15:42:44.327 2019-12-18 16:02:05.063 12A541 2019-12-18 15:54:04.840 2019-12-18 16:12:05.450 13A541 2019-12-18 15:56:44.480 2019-12-18 16:14:44.850 14A541 2019-12-18 15:58:04.407 2019-12-18 16:16:05.407 15 При данной выборке из БД все примеры спотыкаются (в частности от 3unknown) и в результате получается A541 2019-12-18 10:55:24.627 2019-12-18 15:52:04.523A541 2019-12-18 15:33:24.340 2019-12-18 16:16:05.407 nullin Kast2K, вы поясните, случай, который я охарактеризовал у вас возможен? Если - да, то запрос 3unknown, тоже нерабочий, потому что здесь уже шаблонное решение требует учета дополнительных условий. Почему у unknown не работает - читая по диагонали не понятно, надо разбираться. Кинул все предложенные варианты(последние) на dbfiddle Возможен только при услови, что Element разные. В один момент времени в систему попадает несколько Element с одинаковой датой\временем ( A541, 2019-12-18 15:58:04.407, B741, 2019-12-18 15:58:04.407, C121, 2019-12-18 15:58:04.407, ) Выходят (DTE )они также в один и тот же момент ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2019, 16:48 |
|
Нахождение мин. и макс. дат вхождения в диапазон
|
|||
---|---|---|---|
#18+
Kast2K, Интересно какой результат вы ожидаете на таких входных данных. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2019, 17:01 |
|
Нахождение мин. и макс. дат вхождения в диапазон
|
|||
---|---|---|---|
#18+
Kast2K, а один из ответов по ссылке из второго ответа в этой теме отдает верный ответ ) Осталось там только группировку по Element добавить. Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2019, 17:03 |
|
Нахождение мин. и макс. дат вхождения в диапазон
|
|||
---|---|---|---|
#18+
Remind Kast2K, Интересно какой результат вы ожидаете на таких входных данных. A541 2019-12-18 10:55:24.627 2019-12-18 11:31:24.91 A541 2019-12-18 15:33:24.340 2019-12-18 16:16:05.407 ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2019, 17:04 |
|
Нахождение мин. и макс. дат вхождения в диапазон
|
|||
---|---|---|---|
#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. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2019, 17:09 |
|
Нахождение мин. и макс. дат вхождения в диапазон
|
|||
---|---|---|---|
#18+
Kast2K, Как минимум решение nullin'a дает правильный ответ (мое тоже, но у вас версия сервера не подходящая) upd. А, у него тоже lag используется, не заметил сразу. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2019, 17:09 |
|
Нахождение мин. и макс. дат вхождения в диапазон
|
|||
---|---|---|---|
#18+
Remind, да посмотрел - у меня все ок в последнем примере, но у меня там еще order by в окне, в 2008 такого не было - автор конечно вовремя вспомнил) Но все эти lag/lead и прочие нарастающие итоги, имея код на руках, легко отображаются в соответствующие cross/outer apply c top(1) или с агрегацией. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2019, 17:19 |
|
Нахождение мин. и макс. дат вхождения в диапазон
|
|||
---|---|---|---|
#18+
Коллеги, Я хочу всем участвующим огромное спасибо за помощь и примеры реализации. Я понял в чём была моя изначальная ошибка: Скрипт предложенный Minamoto я тестировал на кривых тестовых данных и он не отрабатывал нормально + логика понимания была некорректной (образно, надо 7 раз нарисовать и 1 раз написать :) ) Также, благодаря вам я понял как правильно обрабатывать такие массивы данных и как поменять свою логику работы. Ещё раз всем спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2019, 17:35 |
|
|
start [/forum/search_topic.php?author=Swsov&author_mode=last_topics&do_search=1]: |
0ms |
get settings: |
12ms |
get forum list: |
15ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
29ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 1408ms |
total: | 1562ms |
0 / 0 |