Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности

Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
07.10.2018, 08:28
|
|||
|---|---|---|---|
|
|||
И снова к вопросу пересекающихся интервалов времени |
|||
|
#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. Получаю: Date1 Date2 2018-01-06 00:00:00.000 2018-01-07 00:00:00.000 2018-01-08 00:00:00.000 2018-01-12 00:00:00.000 2018-01-22 00:00:00.000 2018-01-27 00:00:00.000 2018-01-28 00:00:00.000 2018-01-30 00:00:00.000 2018-02-01 00:00:00.000 2018-02-05 00:00:00.000 2018-02-06 00:00:00.000 2018-02-15 00:00:00.000 2018-03-10 00:00:00.000 2018-03-15 00:00:00.000 2018-03-16 00:00:00.000 2018-03-20 00:00:00.000 2018-03-24 00:00:00.000 2018-03-27 00:00:00.000 2018-03-28 00:00:00.000 2018-03-30 00:00:00.000 2018-04-01 00:00:00.000 2018-04-05 00:00:00.000 не хватает двух периодов: 2018-01-03 2018-01-05 2018-01-31 2018-01-31 Это логично, так как когда один период попадает внутрь другого, получается минимум три отрезка, а при сравнивании периодов с самими с собой можно выделить только два. Соответственно проблема возникла с поиском и добавлением пропусков в пересекающихся интервалах. И второй момент, как корректно вычислить среднее значение для случаев, когда на один интервал времени может накладываться неизвестное количество временных интервалов, значение каждого из которых нужно учесть. система Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64) Oct 19 2012 13:38:57 Copyright (c) Microsoft Corporation Enterprise Edition: Core-based Licensing (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
07.10.2018, 09:59
|
|||
|---|---|---|---|
И снова к вопросу пересекающихся интервалов времени |
|||
|
#18+
Учиться надо было в школе. Код: sql 1. and t1.Id <> t2.Id надо ли тебе ДВА раза одинаковые периоды? and t1.Id < t2.Id - будет только один раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
07.10.2018, 10:02
|
|||
|---|---|---|---|
И снова к вопросу пересекающихся интервалов времени |
|||
|
#18+
[quot nk13]И второй момент, как корректно вычислить среднее значение для случаев, когда на один интервал времени может накладываться неизвестное количество временных интервалов, значение каждого из которых нужно учесть. Элементарно, Ватсон! Надо вычислить среднее для каждой точки начала и конца отрезков. Между ними будет постоянно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
07.10.2018, 12:03
|
|||
|---|---|---|---|
|
|||
И снова к вопросу пересекающихся интервалов времени |
|||
|
#18+
aleks222, авторНадо вычислить среднее для каждой точки начала и конца отрезков. Между ними будет постоянно. Согласен. Вопрос в правильном формировании этих отрезков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
07.10.2018, 12:12
|
|||
|---|---|---|---|
|
|||
И снова к вопросу пересекающихся интервалов времени |
|||
|
#18+
aleks222, Учиться надо было в школе. Учиться никогда не поздно. :) авторFROM Test t1 INNER JOIN Test t2 ON t1.Date1 <= t2.Date2 and t2.Date1 <= t1.Date2 and t1.Id <> t2.Id and t1.Id <> t2.Id надо ли тебе ДВА раза одинаковые периоды? and t1.Id < t2.Id - будет только один раз. Специально так делал, чтобы получить в итоге по два отрезка, но как видно выше это не панацея. Нужно подумать, насчет идеи с узловыми точками, может можно и без дублирования записей обойтись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
07.10.2018, 13:37
|
|||
|---|---|---|---|
И снова к вопросу пересекающихся интервалов времени |
|||
|
#18+
nk13Согласен. Вопрос в правильном формировании этих отрезков. Ничо ты не понял. "Формировать" - не надо. Достаточно посчитать среднее для всех СУЩЕСТВУЮЩИХ концов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
07.10.2018, 14:18
|
|||
|---|---|---|---|
|
|||
И снова к вопросу пересекающихся интервалов времени |
|||
|
#18+
aleks222, и тут письмо дошло, спасибо )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
07.10.2018, 15:02
|
|||
|---|---|---|---|
|
|||
И снова к вопросу пересекающихся интервалов времени |
|||
|
#18+
aleks222, вашим способом и правда всё просто, осталось концовки периода получить SELECT q.* FROM (SELECT DISTINCT t.Date1 dt, (SELECT AVG(t0.Value / (DATEDIFF(d, t0.Date1, t0.Date2) + 1)) FROM Test t0 WHERE t.Date1 BETWEEN t0.Date1 AND t0.Date2) Average FROM Test t UNION SELECT DISTINCT DATEADD(d, 1, t.Date2) dt, (SELECT AVG(t0.Value / (DATEDIFF(d, t0.Date1, t0.Date2) + 1)) FROM Test t0 WHERE DATEADD(d, 1, t.Date2) BETWEEN t0.Date1 AND t0.Date2) Average FROM Test t) q WHERE q.Average IS NOT NULL ORDER BY 1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=46&mobile=1&tid=1689004]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
55ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 281ms |
| total: | 422ms |

| 0 / 0 |
