Доброго времени суток,

ищу решение следующей задачи, есть регистр сведений в котором хранятся данные температуры, необходимо получить данные о количестве минут, где температура была выше чем задана условием.

На первый взгляд вроде всё понятно ДОБАВИТЬКДАТЕ и вперед, но основная сложность в том, что в ряде выборки есть значения температуры ниже указанных в условием.

Например, температура в условие 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 сек

Пока вижу возможность решения только через последовательный перебор данных, но буду благодарен если кто-то может подсказать решение как это сделать через запрос.
---
Ну, не так уж много и ВТ получилось:

```1c
    ВЫБРАТЬ
    ИсходнаяТаблица.Время,
    ИсходнаяТаблица.Температура
    ПОМЕСТИТЬ втИсходнаяТаблица
    ИЗ
    &ИсходнаяТаблица КАК ИсходнаяТаблица
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    втИсходнаяТаблица.Время КАК ВремяНачало,
    МИНИМУМ(втИсходнаяТаблица1.Время) КАК ВремяОкончание
    ПОМЕСТИТЬ вт1
    ИЗ
    втИсходнаяТаблица КАК втИсходнаяТаблица
    ЛЕВОЕ СОЕДИНЕНИЕ втИсходнаяТаблица КАК втИсходнаяТаблица1
    ПО втИсходнаяТаблица.Время < втИсходнаяТаблица1.Время

    СГРУППИРОВАТЬ ПО
    втИсходнаяТаблица.Время
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    вт1.ВремяНачало,
    вт1.ВремяОкончание,
    РАЗНОСТЬДАТ(вт1.ВремяНачало, вт1.ВремяОкончание, СЕКУНДА) КАК Время
    ИЗ
    вт1 КАК вт1
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ втИсходнаяТаблица КАК втИсходнаяТаблица
    ПО вт1.ВремяНачало = втИсходнаяТаблица.Время
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ втИсходнаяТаблица КАК втИсходнаяТаблица1
    ПО вт1.ВремяОкончание = втИсходнаяТаблица1.Время
    ГДЕ
    НЕ вт1.ВремяОкончание ЕСТЬ NULL
    И втИсходнаяТаблица.Температура >= &Порог
    И втИсходнаяТаблица1.Температура >= &Порог
```

Вместо параметра с ТЗ "&ИсходнаяТаблица" нужно подставить свою таблицу как источник данных.
Результат с примера из шапки ниже, можете протестировать на других.
---
Сделайте обычное условие

Где температура >= 110

Запись со значением ниже просто не попадет в выборку. дальше уже группируйте по минуте и найдете количество секунд
---
Если я правильно понял, ему последовательность нужно разбить на периоды, границей которых являются записи со значением температуры ниже определенного значения. Т.е. в примере автора как раз два периода.
А потом уже, считать продолжительность этих периодов.

Предложенное условие просто отбросит эти записи и получиться один период от минимума до максимума.
---
границей которых являются записи со значением температуры ниже определенного значения

совершенно верно, именно поэтому условие "Где температура >= 110", никак не подойдет
---
хорошо, представим случай
1. температура очень долго не опускалась ниже граничного значения
2. температура всегда была ниже граничного значения, кроме, скажем, первого замера.
как будете определять границу?
---
да собственно без разницы, если сгруппировать по часу, минуте, то можно получить количество секунд в пределах минуты и в результате суммировать количество секунд.

сложность заключается в том, чтобы было строго по 2 записи о времени.
---
Причем здесь группировка вообще не понятно. Как это решает проблему определения границ периодов?
---
группировка никак не решит проблему определения границ периодов.
Вы ответьте сначала на вопрос из (7).
---
Ну это не мне надо отвечать, а автору. Но попробую:
1. Не понял, в чём тут проблема. Может приведёте пример? Если в выборке за конкретный период нет значений ниже граничного, то это самый простой вариант - период один, от начала выборки до её конца.
2. Значит нет периодов, по которым нужно рассчитывать время. По крайней мере, пока в неё не попадёт следующее значение превышающее порог.
---
в обоих случаях необходимо "дорисовать" несуществующую границу для решения поставленной задачи, так?

я понимаю, что вы не автор, но задавая вопросы вам, я надеюсь, автор таки прочитает все сообщения в теме и сделает правильные умозаключения.
---
В результате общее времени должно быть (09:15:50 - 09:15:35) + (09:16:35 - 09:16:20) = 30 сек
по моему мнению это не так
до 09:16:05 температура была не ниже 110, т.е. первый интервал будет 09:16:04 - 09:15:35 = 29 секунд
---
А почему вы решили, что температура упала до "нормы" в 09:16:04, а не в любой другое значение времени в промежутке с 09:15:51 по 09:16:04?
Это просто проблема точности из-за дискретности измерения.
---
а вы почему решили что это не так? Вот точно на таком же основании.
---
Потому что, вы делаете неверное утверждение:
до 09:16:05 температура была не ниже 110
Автору нужно посчитать только те отрезки времени, в которых, согласно данным измерения, температура объективно превышала норму, не с допущениями.
---
Потому что, вы делаете неверное утверждение
где я что-то утвтерждал? я высказал своё мнение. А вот вы что-там там утверждаете.
---
У вас, что-то с логикой. Перечитайте своё (8) .
по моему мнению это не так
до 09:16:05 температура была не ниже 110
Отрицать что-то можно только на основе утверждения, а предположения не могут быть основой для отрицания чего-то.
В данном случае может быть прав автор, также как и вы. Поэтому отрицать его вариант решения неверно.
---
вы жирным выделили не то, вот что надо по моему мнению
---
Я выделил именно то, что надо, т.к. вы своим мнением отвергаете вариант решения задачи, предложенный автором, на основе необоснованного утверждения.
---
вы своим мнением отвергаете вариант решения задачи, предложенный автором
где это было? покажите. Ваше утверждение не обосновано.
---
Всё ваше (8). Я уже задолбался цитировать одно и тоже, а всё время получаю вопрос "где?". Лучше бы было тогда уже каноничное "И чё?".
---
сударь, вы,извините, пустослов
---
Если аргументы по теме закончились, переходите на личность? Ну-ну... всё ясно.
---
аргументы по теме у вас и не начинались. вот это теперь моё утверждение. удачи.
---
Мои аргументы - это, как минимум, попытка решения задачи автора. Доказательство прикреплено к шапке, а все ваши аргументы - "и чё?" "и где?".
И вам того же.
---
по вашему же подходу получается что в интервале с 09:16:05 до 09:16:20 температура уже могла быть выше 110, но мы почему-то принимаем весь интервал.
---
Я лишь написал, что вы не должны отклонять вариант решения предложенный автором как неверный. Я уже писал, что это проблема дискретности измерения, вызывающая погрешность. И все варианты решения с границей в указанном промежутке являются допустимыми.
Оптимальнее тогда, наверное, будет определять границу по среднему значению времени в периоде, а не по его "нижней" границе.
---
перечитал все ваши "типа" аргументы. Свой вариант подсчета считаю наиболее верным по причинам, изложенным в (19).
---
Я на это уже отвечал в (14) .
Автору нужно посчитать только те отрезки времени, в которых, согласно данным измерения, температура объективно превышала норму, а не с допущениями.
В общем, пусть решает сам автор, это его задача.
---
конечно пусть автор решает. Там в любом случае запросом можно всё посчитать за пару минут.
---
смотрите в сторону "непрерывные интервалы":
https://infostart.ru/public/402534/
---
Есть в запросе еще функция РАЗНОСТЬДАТ. Для условия можно использовать ВЫБОР КОГДА ... архитектуру таблиц знаете только вы
---
архитектуру таблиц

она предельно простая Период и Значение температуры. Данные температуры записываются каждые 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, и все эти записи имеют температуру ниже целевой
---
так они вам не нужны вообще.
У вас задача посчитать время между двумя датами. как вы добьетесь этого - дело 10-е.
Даже если будет запись о том, что температура была ниже порога, вам это никак не поможет в решении задачи определения двух границ, когда температура таки была выше порога.
---
12.10.2021 13:24:35 111,2
12.10.2021 13:25:25 112,17
12.10.2021 13:25:50 111,82
Если записи делаются строго каждые 15 сек, то тут 3 значения со своим интервалом. Есть пропуски между 1 и 2 записью, и есть пропуски между 2 и 3 записью.
Теперь вопрос: какой интервал у этих 3 значений, если они никак не связаны между собой и относятся каждый к своему интервалу?
---
может быть сделать пакетный запрос и добавить еще одно поле:

```1c
    Выбор Когда температура >110 Тогда Ложь Иначе Истина Конец Как Учитывать
```

тогда в выборку попадет эта граница.
тут бы по хорошему сделать 2 поля на интервал - начало и окончание, но вот как... сходу не осилил
---
Достаточно написать просто:

```1c
    температура >= 110 КАК Учитывать
```
---
согласен))
---
необходимо пронумеровать записи с учетом группировки по периоду записи и потом соединятся по условию НомерСтроки Между 0 и 1
---
вот тут я "завис" )) не знаю этого приёма...
---
юху, нашел! Всем спасибо за помощь, решение было на поверхности, "ВЫБОР КОГДА T >= 110 ТОГДА 15 ИНАЧЕ 0"

задача решена
---
что будет в вашем решении, если какой-то записи вдруг не будет в "логе"(оборудование глюкануло)?
---
А что будет если в выборке только такое?
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
По вашему текущему решению значение времени должно быть 45. Что противоречит тому что вы описывали в шапке.
---
Что противоречит тому что вы описывали в шапке
упс, согласен, глюканул. Да, это не то, что требовалось по условию, копаю дальше.

А что будет если в выборке только такое?
ответ: 0
---
Значит задача решается "дорисовыванием" границ так, чтобы в итоговой таблице было таки как минимум 2 и как максимум - 120 записей за 30 минут.

выкидываем все, что ниже порога и к имеющимся "дорисовываем" конец интервала как ДобавитьКДате(Период, Секунда, 15)
---
По хорошему, нужно делать сложный запрос с "кучей" временных таблиц. Примерный алгоритм такой.
1. Делаем запрос выборкой только времени без значения температуры с соединением первичной таблицы самой на себя, с ограничением по значению температуры в "нижней" границе времени ниже порога и с группировкой агрегации значении времени.
2. Полученные периоды опять соединяем с первичной таблицей данных, чтобы сместить "нижнюю" границу выше времени порога.
3. После чего уже считаем время по каждому периоду.
---
Ну, не так уж много и ВТ получилось:

```1c
    ВЫБРАТЬ
    ИсходнаяТаблица.Время,
    ИсходнаяТаблица.Температура
    ПОМЕСТИТЬ втИсходнаяТаблица
    ИЗ
    &ИсходнаяТаблица КАК ИсходнаяТаблица
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    втИсходнаяТаблица.Время КАК ВремяНачало,
    МИНИМУМ(втИсходнаяТаблица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
---
Это всё ОК потому, что предыдущие две записи по температуре в сумме равны 3-й с минусом. А что будет, если перед ней будет 3, а не 2 как сейчас?
---
Или как оно будет работать с примером, который я привел в (36) ?
---
как оно будет работать с примером, который я привел в (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 сек)
---
И где же тут косяк только в первой, если и без неё у вас время в минус уходит? Конечно можно ограничить значение "снизу" нулем, но это не очень хорошее решение, хотя и возможное.
Таже проблема будет, если значение меньше порога будет последним.
Например:
09:17:15 110 - 15
09:17:30 111 - 15
09:17:45 112 - 15
09:18:00 109 - -30
Вместо 30 секунд будет 15.
---
Вообще я вам уже дал почти готовое решение в (43) .
Так, что пока не вижу, что мне тут ещё можно обсуждать, кроме возможных ошибок в нём.
---
Вообще я вам уже дал почти готовое решение

тысячекратно извиняюсь, Меркурий в доме Юпитера, я реально пропустил этот пост, в двух словах круть, работает супер, я бы самостоятельно до такой идеи не допёр.

Премного благодарен!
---
разобрался
---
покажите исходную таблицу, я проверю.