Запросом получить разницу времени если выполняется условие
Доброго времени суток,
ищу решение следующей задачи, есть регистр сведений в котором хранятся данные температуры, необходимо получить данные о количестве минут, где температура была выше чем задана условием.
На первый взгляд вроде всё понятно ДОБАВИТЬКДАТЕ и вперед, но основная сложность в том, что в ряде выборки есть значения температуры ниже указанных в условием.
Например, температура в условие 110:
время температура
09:15:35 115
09:15:50 117
09:16:05 109 - значение не должно учитываться
09:16:20 111
09:16:35 114
В результате общее времени должно быть (09:15:50 - 09:15:35) + (09:16:35 - 09:16:20) = 30 сек
Пока вижу возможность решения только через последовательный перебор данных, но буду благодарен если кто-то может подсказать решение как это сделать через запрос.
ищу решение следующей задачи, есть регистр сведений в котором хранятся данные температуры, необходимо получить данные о количестве минут, где температура была выше чем задана условием.
На первый взгляд вроде всё понятно ДОБАВИТЬКДАТЕ и вперед, но основная сложность в том, что в ряде выборки есть значения температуры ниже указанных в условием.
Например, температура в условие 110:
время температура
09:15:35 115
09:15:50 117
09:16:05 109 - значение не должно учитываться
09:16:20 111
09:16:35 114
В результате общее времени должно быть (09:15:50 - 09:15:35) + (09:16:35 - 09:16:20) = 30 сек
Пока вижу возможность решения только через последовательный перебор данных, но буду благодарен если кто-то может подсказать решение как это сделать через запрос.
По теме из базы знаний
- Консультация для сдачи экзамена "1С:Специалист" по конфигурированию платформы
- Зачем запросу план и кто его выполняет?
- Оптимизатор запросов. Вторая часть
- Смотрим запросы 1С через Microsoft SQL Profiler по следам ошибок разработчиков, приводящих к проблемам производительности
- Как читать чужой код? Часть 3. Разбор и доработка запросов
Найденные решения
(37) Ну, не так уж много и ВТ получилось:
Вместо параметра с ТЗ "&ИсходнаяТаблица" нужно подставить свою таблицу как источник данных.
Результат с примера из шапки ниже, можете протестировать на других.
ВЫБРАТЬ
ИсходнаяТаблица.Время,
ИсходнаяТаблица.Температура
ПОМЕСТИТЬ втИсходнаяТаблица
ИЗ
&ИсходнаяТаблица КАК ИсходнаяТаблица
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
втИсходнаяТаблица.Время КАК ВремяНачало,
МИНИМУМ(втИсходнаяТаблица1.Время) КАК ВремяОкончание
ПОМЕСТИТЬ вт1
ИЗ
втИсходнаяТаблица КАК втИсходнаяТаблица
ЛЕВОЕ СОЕДИНЕНИЕ втИсходнаяТаблица КАК втИсходнаяТаблица1
ПО втИсходнаяТаблица.Время < втИсходнаяТаблица1.Время
СГРУППИРОВАТЬ ПО
втИсходнаяТаблица.Время
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
вт1.ВремяНачало,
вт1.ВремяОкончание,
РАЗНОСТЬДАТ(вт1.ВремяНачало, вт1.ВремяОкончание, СЕКУНДА) КАК Время
ИЗ
вт1 КАК вт1
ВНУТРЕННЕЕ СОЕДИНЕНИЕ втИсходнаяТаблица КАК втИсходнаяТаблица
ПО вт1.ВремяНачало = втИсходнаяТаблица.Время
ВНУТРЕННЕЕ СОЕДИНЕНИЕ втИсходнаяТаблица КАК втИсходнаяТаблица1
ПО вт1.ВремяОкончание = втИсходнаяТаблица1.Время
ГДЕ
НЕ вт1.ВремяОкончание ЕСТЬ NULL
И втИсходнаяТаблица.Температура >= &Порог
И втИсходнаяТаблица1.Температура >= &Порог
ПоказатьВместо параметра с ТЗ "&ИсходнаяТаблица" нужно подставить свою таблицу как источник данных.
Результат с примера из шапки ниже, можете протестировать на других.
Прикрепленные файлы:
Остальные ответы
В избранное
Подписаться на ответы
Сортировка:
Древо развёрнутое
Свернуть все
(2) Если я правильно понял, ему последовательность нужно разбить на периоды, границей которых являются записи со значением температуры ниже определенного значения. Т.е. в примере автора как раз два периода.
А потом уже, считать продолжительность этих периодов.
Предложенное условие просто отбросит эти записи и получиться один период от минимума до максимума.
А потом уже, считать продолжительность этих периодов.
Предложенное условие просто отбросит эти записи и получиться один период от минимума до максимума.
(11) Ну это не мне надо отвечать, а автору. Но попробую:
1. Не понял, в чём тут проблема. Может приведёте пример? Если в выборке за конкретный период нет значений ниже граничного, то это самый простой вариант - период один, от начала выборки до её конца.
2. Значит нет периодов, по которым нужно рассчитывать время. По крайней мере, пока в неё не попадёт следующее значение превышающее порог.
1. Не понял, в чём тут проблема. Может приведёте пример? Если в выборке за конкретный период нет значений ниже граничного, то это самый простой вариант - период один, от начала выборки до её конца.
2. Значит нет периодов, по которым нужно рассчитывать время. По крайней мере, пока в неё не попадёт следующее значение превышающее порог.
(16) У вас, что-то с логикой. Перечитайте своё (8) .
Отрицать что-то можно только на основе утверждения, а предположения не могут быть основой для отрицания чего-то.
В данном случае может быть прав автор, также как и вы. Поэтому отрицать его вариант решения неверно.
по моему мнению это не так
до 09:16:05 температура была не ниже 110
Отрицать что-то можно только на основе утверждения, а предположения не могут быть основой для отрицания чего-то.
В данном случае может быть прав автор, также как и вы. Поэтому отрицать его вариант решения неверно.
(19) Я лишь написал, что вы не должны отклонять вариант решения предложенный автором как неверный. Я уже писал, что это проблема дискретности измерения, вызывающая погрешность. И все варианты решения с границей в указанном промежутке являются допустимыми.
Оптимальнее тогда, наверное, будет определять границу по среднему значению времени в периоде, а не по его "нижней" границе.
Оптимальнее тогда, наверное, будет определять границу по среднему значению времени в периоде, а не по его "нижней" границе.
(6)
она предельно простая Период и Значение температуры. Данные температуры записываются каждые 15 секунд, температурная выдержка длится не более 30 минут. То есть максимально количество записей для обработки будет 120
А теперь почему не подойдет выборка с условием температура >110, ее результат будет следующий:
Timestamp T
12.10.2021 13:24:35 111,2
12.10.2021 13:25:25 112,17
12.10.2021 13:25:50 111,82
в нем отсутствуют записи в промежутке между 13:24:35 - 13:25:25, и все эти записи имеют температуру ниже целевой
архитектуру таблиц
она предельно простая Период и Значение температуры. Данные температуры записываются каждые 15 секунд, температурная выдержка длится не более 30 минут. То есть максимально количество записей для обработки будет 120
А теперь почему не подойдет выборка с условием температура >110, ее результат будет следующий:
Timestamp T
12.10.2021 13:24:35 111,2
12.10.2021 13:25:25 112,17
12.10.2021 13:25:50 111,82
в нем отсутствуют записи в промежутке между 13:24:35 - 13:25:25, и все эти записи имеют температуру ниже целевой
(9)так они вам не нужны вообще.
У вас задача посчитать время между двумя датами. как вы добьетесь этого - дело 10-е.
Даже если будет запись о том, что температура была ниже порога, вам это никак не поможет в решении задачи определения двух границ, когда температура таки была выше порога.
У вас задача посчитать время между двумя датами. как вы добьетесь этого - дело 10-е.
Даже если будет запись о том, что температура была ниже порога, вам это никак не поможет в решении задачи определения двух границ, когда температура таки была выше порога.
(9)
Если записи делаются строго каждые 15 сек, то тут 3 значения со своим интервалом. Есть пропуски между 1 и 2 записью, и есть пропуски между 2 и 3 записью.
Теперь вопрос: какой интервал у этих 3 значений, если они никак не связаны между собой и относятся каждый к своему интервалу?
12.10.2021 13:24:35 111,2
12.10.2021 13:25:25 112,17
12.10.2021 13:25:50 111,82
12.10.2021 13:25:25 112,17
12.10.2021 13:25:50 111,82
Если записи делаются строго каждые 15 сек, то тут 3 значения со своим интервалом. Есть пропуски между 1 и 2 записью, и есть пропуски между 2 и 3 записью.
Теперь вопрос: какой интервал у этих 3 значений, если они никак не связаны между собой и относятся каждый к своему интервалу?
(9) может быть сделать пакетный запрос и добавить еще одно поле:
тогда в выборку попадет эта граница.
тут бы по хорошему сделать 2 поля на интервал - начало и окончание, но вот как... сходу не осилил
Выбор Когда температура >110 Тогда Ложь Иначе Истина Конец Как Учитывать
тогда в выборку попадет эта граница.
тут бы по хорошему сделать 2 поля на интервал - начало и окончание, но вот как... сходу не осилил
(23) А что будет если в выборке только такое?
По вашему текущему решению значение времени должно быть 45. Что противоречит тому что вы описывали в шапке.
09:16:05 109 - значение не должно учитываться
09:16:20 111
09:16:35 109 - значение не должно учитываться
09:16:50 111
09:17:15 109 - значение не должно учитываться
09:17:30 111
09:17:45 109 - значение не должно учитываться
09:18:00 111
09:16:20 111
09:16:35 109 - значение не должно учитываться
09:16:50 111
09:17:15 109 - значение не должно учитываться
09:17:30 111
09:17:45 109 - значение не должно учитываться
09:18:00 111
По вашему текущему решению значение времени должно быть 45. Что противоречит тому что вы описывали в шапке.
(37)Значит задача решается "дорисовыванием" границ так, чтобы в итоговой таблице было таки как минимум 2 и как максимум - 120 записей за 30 минут.
выкидываем все, что ниже порога и к имеющимся "дорисовываем" конец интервала как ДобавитьКДате(Период, Секунда, 15)
выкидываем все, что ниже порога и к имеющимся "дорисовываем" конец интервала как ДобавитьКДате(Период, Секунда, 15)
(37) По хорошему, нужно делать сложный запрос с "кучей" временных таблиц. Примерный алгоритм такой.
1. Делаем запрос выборкой только времени без значения температуры с соединением первичной таблицы самой на себя, с ограничением по значению температуры в "нижней" границе времени ниже порога и с группировкой агрегации значении времени.
2. Полученные периоды опять соединяем с первичной таблицей данных, чтобы сместить "нижнюю" границу выше времени порога.
3. После чего уже считаем время по каждому периоду.
1. Делаем запрос выборкой только времени без значения температуры с соединением первичной таблицы самой на себя, с ограничением по значению температуры в "нижней" границе времени ниже порога и с группировкой агрегации значении времени.
2. Полученные периоды опять соединяем с первичной таблицей данных, чтобы сместить "нижнюю" границу выше времени порога.
3. После чего уже считаем время по каждому периоду.
(37) Ну, не так уж много и ВТ получилось:
Вместо параметра с ТЗ "&ИсходнаяТаблица" нужно подставить свою таблицу как источник данных.
Результат с примера из шапки ниже, можете протестировать на других.
ВЫБРАТЬ
ИсходнаяТаблица.Время,
ИсходнаяТаблица.Температура
ПОМЕСТИТЬ втИсходнаяТаблица
ИЗ
&ИсходнаяТаблица КАК ИсходнаяТаблица
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
втИсходнаяТаблица.Время КАК ВремяНачало,
МИНИМУМ(втИсходнаяТаблица1.Время) КАК ВремяОкончание
ПОМЕСТИТЬ вт1
ИЗ
втИсходнаяТаблица КАК втИсходнаяТаблица
ЛЕВОЕ СОЕДИНЕНИЕ втИсходнаяТаблица КАК втИсходнаяТаблица1
ПО втИсходнаяТаблица.Время < втИсходнаяТаблица1.Время
СГРУППИРОВАТЬ ПО
втИсходнаяТаблица.Время
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
вт1.ВремяНачало,
вт1.ВремяОкончание,
РАЗНОСТЬДАТ(вт1.ВремяНачало, вт1.ВремяОкончание, СЕКУНДА) КАК Время
ИЗ
вт1 КАК вт1
ВНУТРЕННЕЕ СОЕДИНЕНИЕ втИсходнаяТаблица КАК втИсходнаяТаблица
ПО вт1.ВремяНачало = втИсходнаяТаблица.Время
ВНУТРЕННЕЕ СОЕДИНЕНИЕ втИсходнаяТаблица КАК втИсходнаяТаблица1
ПО вт1.ВремяОкончание = втИсходнаяТаблица1.Время
ГДЕ
НЕ вт1.ВремяОкончание ЕСТЬ NULL
И втИсходнаяТаблица.Температура >= &Порог
И втИсходнаяТаблица1.Температура >= &Порог
ПоказатьВместо параметра с ТЗ "&ИсходнаяТаблица" нужно подставить свою таблицу как источник данных.
Результат с примера из шапки ниже, можете протестировать на других.
Прикрепленные файлы:
"ВЫБОР КОГДА T >= 110 ТОГДА 15 ИНАЧЕ -30", а вот так взлетело, поюзаю с большим массивом, но на тестовом примере все ок.
Timestamp__________T__Сек
14.10.2021 10:00:00 115 15
14.10.2021 10:15:00 117 15
14.10.2021 10:30:00 109 -30
14.10.2021 10:45:00 111 15
14.10.2021 11:00:00 114 15
Timestamp__________T__Сек
14.10.2021 10:00:00 115 15
14.10.2021 10:15:00 117 15
14.10.2021 10:30:00 109 -30
14.10.2021 10:45:00 111 15
14.10.2021 11:00:00 114 15
(45)
Тут, в общем итоге, будет косяк только с первой записью:
Timestamp________T__Сек
14.10.2021 9:16:05 109 -30
14.10.2021 9:16:20 111 15
14.10.2021 9:16:35 109 -30
14.10.2021 9:16:50 111 15
14.10.2021 9:17:05 109 -30
14.10.2021 9:17:20 111 15
А в отношении любой другой конструкции, поправьте если я не прав, за основу принимается, что интервал всегда равен ровно 15 секунд, если текущее значение >= условия (110°C) тогда общее время = общее время + 15 сек, иначе текущее значение 0, а промежуток времени между предыдущей записью и последующей записью не должны учитываться, другими словами температура набиралась, чтобы достичь установленную, так температурная выдержка это температура выше 110°C на протяжении определенного времени (-30 сек)
как оно будет работать с примером, который я привел в (36)
Тут, в общем итоге, будет косяк только с первой записью:
Timestamp________T__Сек
14.10.2021 9:16:05 109 -30
14.10.2021 9:16:20 111 15
14.10.2021 9:16:35 109 -30
14.10.2021 9:16:50 111 15
14.10.2021 9:17:05 109 -30
14.10.2021 9:17:20 111 15
А в отношении любой другой конструкции, поправьте если я не прав, за основу принимается, что интервал всегда равен ровно 15 секунд, если текущее значение >= условия (110°C) тогда общее время = общее время + 15 сек, иначе текущее значение 0, а промежуток времени между предыдущей записью и последующей записью не должны учитываться, другими словами температура набиралась, чтобы достичь установленную, так температурная выдержка это температура выше 110°C на протяжении определенного времени (-30 сек)
(48) И где же тут косяк только в первой, если и без неё у вас время в минус уходит? Конечно можно ограничить значение "снизу" нулем, но это не очень хорошее решение, хотя и возможное.
Таже проблема будет, если значение меньше порога будет последним.
Например:
09:17:15 110 - 15
09:17:30 111 - 15
09:17:45 112 - 15
09:18:00 109 - -30
Вместо 30 секунд будет 15.
Таже проблема будет, если значение меньше порога будет последним.
Например:
09:17:15 110 - 15
09:17:30 111 - 15
09:17:45 112 - 15
09:18:00 109 - -30
Вместо 30 секунд будет 15.
Вакансии
Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)