Запросом получить разницу времени если выполняется условие

1. 14.10.21 10:37 Сейчас в теме
Доброго времени суток,

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

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

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

Пока вижу возможность решения только через последовательный перебор данных, но буду благодарен если кто-то может подсказать решение как это сделать через запрос.
Найденные решения
43. Release 14.10.21 12:47 Сейчас в теме
(37) Ну, не так уж много и ВТ получилось:
ВЫБРАТЬ
	ИсходнаяТаблица.Время,
	ИсходнаяТаблица.Температура
ПОМЕСТИТЬ втИсходнаяТаблица
ИЗ
	&ИсходнаяТаблица КАК ИсходнаяТаблица
;

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

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

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

Вместо параметра с ТЗ "&ИсходнаяТаблица" нужно подставить свою таблицу как источник данных.
Результат с примера из шапки ниже, можете протестировать на других.
Прикрепленные файлы:
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. nomad_irk 57 14.10.21 10:44 Сейчас в теме
(1)Сделайте обычное условие

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

Запись со значением ниже просто не попадет в выборку. дальше уже группируйте по минуте и найдете количество секунд
3. Release 14.10.21 10:49 Сейчас в теме
(2) Если я правильно понял, ему последовательность нужно разбить на периоды, границей которых являются записи со значением температуры ниже определенного значения. Т.е. в примере автора как раз два периода.
А потом уже, считать продолжительность этих периодов.

Предложенное условие просто отбросит эти записи и получиться один период от минимума до максимума.
4. Ligret 14.10.21 10:52 Сейчас в теме
(3)
границей которых являются записи со значением температуры ниже определенного значения


совершенно верно, именно поэтому условие "Где температура >= 110", никак не подойдет
7. nomad_irk 57 14.10.21 10:56 Сейчас в теме
(4)хорошо, представим случай
1. температура очень долго не опускалась ниже граничного значения
2. температура всегда была ниже граничного значения, кроме, скажем, первого замера.
как будете определять границу?
5. nomad_irk 57 14.10.21 10:55 Сейчас в теме
(3)да собственно без разницы, если сгруппировать по часу, минуте, то можно получить количество секунд в пределах минуты и в результате суммировать количество секунд.

сложность заключается в том, чтобы было строго по 2 записи о времени.
10. Release 14.10.21 11:08 Сейчас в теме
(5) Причем здесь группировка вообще не понятно. Как это решает проблему определения границ периодов?
11. nomad_irk 57 14.10.21 11:10 Сейчас в теме
(10)группировка никак не решит проблему определения границ периодов.
Вы ответьте сначала на вопрос из (7).
17. Release 14.10.21 11:29 Сейчас в теме
(11) Ну это не мне надо отвечать, а автору. Но попробую:
1. Не понял, в чём тут проблема. Может приведёте пример? Если в выборке за конкретный период нет значений ниже граничного, то это самый простой вариант - период один, от начала выборки до её конца.
2. Значит нет периодов, по которым нужно рассчитывать время. По крайней мере, пока в неё не попадёт следующее значение превышающее порог.
20. nomad_irk 57 14.10.21 11:32 Сейчас в теме
(17) в обоих случаях необходимо "дорисовать" несуществующую границу для решения поставленной задачи, так?

я понимаю, что вы не автор, но задавая вопросы вам, я надеюсь, автор таки прочитает все сообщения в теме и сделает правильные умозаключения.
8. ZergKRSK 128 14.10.21 10:58 Сейчас в теме
(1)
В результате общее времени должно быть (09:15:50 - 09:15:35) + (09:16:35 - 09:16:20) = 30 сек

по моему мнению это не так
до 09:16:05 температура была не ниже 110, т.е. первый интервал будет 09:16:04 - 09:15:35 = 29 секунд
12. Release 14.10.21 11:11 Сейчас в теме
(8) А почему вы решили, что температура упала до "нормы" в 09:16:04, а не в любой другое значение времени в промежутке с 09:15:51 по 09:16:04?
Это просто проблема точности из-за дискретности измерения.
13. ZergKRSK 128 14.10.21 11:13 Сейчас в теме
(12) а вы почему решили что это не так? Вот точно на таком же основании.
14. Release 14.10.21 11:16 Сейчас в теме
(13) Потому что, вы делаете неверное утверждение:
до 09:16:05 температура была не ниже 110

Автору нужно посчитать только те отрезки времени, в которых, согласно данным измерения, температура объективно превышала норму, не с допущениями.
16. ZergKRSK 128 14.10.21 11:28 Сейчас в теме
(14)
Потому что, вы делаете неверное утверждение

где я что-то утвтерждал? я высказал своё мнение. А вот вы что-там там утверждаете.
22. Release 14.10.21 11:35 Сейчас в теме
(16) У вас, что-то с логикой. Перечитайте своё (8) .
по моему мнению это не так

до 09:16:05 температура была не ниже 110

Отрицать что-то можно только на основе утверждения, а предположения не могут быть основой для отрицания чего-то.
В данном случае может быть прав автор, также как и вы. Поэтому отрицать его вариант решения неверно.
25. ZergKRSK 128 14.10.21 11:41 Сейчас в теме
(22) вы жирным выделили не то, вот что надо по моему мнению
29. Release 14.10.21 11:45 Сейчас в теме
(25) Я выделил именно то, что надо, т.к. вы своим мнением отвергаете вариант решения задачи, предложенный автором, на основе необоснованного утверждения.
33. ZergKRSK 128 14.10.21 11:49 Сейчас в теме
(29)
вы своим мнением отвергаете вариант решения задачи, предложенный автором

где это было? покажите. Ваше утверждение не обосновано.
39. Release 14.10.21 11:59 Сейчас в теме
(33) Всё ваше (8). Я уже задолбался цитировать одно и тоже, а всё время получаю вопрос "где?". Лучше бы было тогда уже каноничное "И чё?".
46. ZergKRSK 128 14.10.21 13:01 Сейчас в теме
(39) сударь, вы,извините, пустослов
47. Release 14.10.21 13:04 Сейчас в теме
(46) Если аргументы по теме закончились, переходите на личность? Ну-ну... всё ясно.
54. ZergKRSK 128 15.10.21 03:33 Сейчас в теме
(47) аргументы по теме у вас и не начинались. вот это теперь моё утверждение. удачи.
55. Release 15.10.21 09:06 Сейчас в теме
(54) Мои аргументы - это, как минимум, попытка решения задачи автора. Доказательство прикреплено к шапке, а все ваши аргументы - "и чё?" "и где?".
И вам того же.
19. ZergKRSK 128 14.10.21 11:32 Сейчас в теме
(14) по вашему же подходу получается что в интервале с 09:16:05 до 09:16:20 температура уже могла быть выше 110, но мы почему-то принимаем весь интервал.
26. Release 14.10.21 11:41 Сейчас в теме
(19) Я лишь написал, что вы не должны отклонять вариант решения предложенный автором как неверный. Я уже писал, что это проблема дискретности измерения, вызывающая погрешность. И все варианты решения с границей в указанном промежутке являются допустимыми.
Оптимальнее тогда, наверное, будет определять границу по среднему значению времени в периоде, а не по его "нижней" границе.
28. ZergKRSK 128 14.10.21 11:44 Сейчас в теме
(26) перечитал все ваши "типа" аргументы. Свой вариант подсчета считаю наиболее верным по причинам, изложенным в (19).
31. Release 14.10.21 11:48 Сейчас в теме
(28) Я на это уже отвечал в (14) .
Автору нужно посчитать только те отрезки времени, в которых, согласно данным измерения, температура объективно превышала норму, а не с допущениями.

В общем, пусть решает сам автор, это его задача.
35. ZergKRSK 128 14.10.21 11:53 Сейчас в теме
(31) конечно пусть автор решает. Там в любом случае запросом можно всё посчитать за пару минут.
15. spacecraft 14.10.21 11:23 Сейчас в теме
(1) смотрите в сторону "непрерывные интервалы":
https://infostart.ru/public/402534/
6. DJ_Codebase 14.10.21 10:56 Сейчас в теме
Есть в запросе еще функция РАЗНОСТЬДАТ. Для условия можно использовать ВЫБОР КОГДА ... архитектуру таблиц знаете только вы
9. Ligret 14.10.21 11:08 Сейчас в теме
(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, и все эти записи имеют температуру ниже целевой
18. nomad_irk 57 14.10.21 11:30 Сейчас в теме
(9)так они вам не нужны вообще.
У вас задача посчитать время между двумя датами. как вы добьетесь этого - дело 10-е.
Даже если будет запись о том, что температура была ниже порога, вам это никак не поможет в решении задачи определения двух границ, когда температура таки была выше порога.
21. spacecraft 14.10.21 11:35 Сейчас в теме
(9)
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 значений, если они никак не связаны между собой и относятся каждый к своему интервалу?
27. DJ_Codebase 14.10.21 11:44 Сейчас в теме
(9) может быть сделать пакетный запрос и добавить еще одно поле:
Выбор Когда температура >110 Тогда Ложь Иначе Истина Конец Как Учитывать

тогда в выборку попадет эта граница.
тут бы по хорошему сделать 2 поля на интервал - начало и окончание, но вот как... сходу не осилил
30. nomad_irk 57 14.10.21 11:45 Сейчас в теме
(27)Достаточно написать просто:

температура >= 110 КАК Учитывать
34. DJ_Codebase 14.10.21 11:51 Сейчас в теме
32. nomad_irk 57 14.10.21 11:49 Сейчас в теме
(27)необходимо пронумеровать записи с учетом группировки по периоду записи и потом соединятся по условию НомерСтроки Между 0 и 1
38. DJ_Codebase 14.10.21 11:58 Сейчас в теме
(32) вот тут я "завис" )) не знаю этого приёма...
23. Ligret 14.10.21 11:36 Сейчас в теме
юху, нашел! Всем спасибо за помощь, решение было на поверхности, "ВЫБОР КОГДА T >= 110 ТОГДА 15 ИНАЧЕ 0"

задача решена
24. nomad_irk 57 14.10.21 11:41 Сейчас в теме
(23)что будет в вашем решении, если какой-то записи вдруг не будет в "логе"(оборудование глюкануло)?
36. Release 14.10.21 11:56 Сейчас в теме
(23) А что будет если в выборке только такое?
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. Что противоречит тому что вы описывали в шапке.
nomad_irk; +1 Ответить
37. Ligret 14.10.21 11:57 Сейчас в теме
(36)
Что противоречит тому что вы описывали в шапке

упс, согласен, глюканул. Да, это не то, что требовалось по условию, копаю дальше.

А что будет если в выборке только такое?

ответ: 0
40. nomad_irk 57 14.10.21 12:08 Сейчас в теме
(37)Значит задача решается "дорисовыванием" границ так, чтобы в итоговой таблице было таки как минимум 2 и как максимум - 120 записей за 30 минут.

выкидываем все, что ниже порога и к имеющимся "дорисовываем" конец интервала как ДобавитьКДате(Период, Секунда, 15)
41. Release 14.10.21 12:09 Сейчас в теме
(37) По хорошему, нужно делать сложный запрос с "кучей" временных таблиц. Примерный алгоритм такой.
1. Делаем запрос выборкой только времени без значения температуры с соединением первичной таблицы самой на себя, с ограничением по значению температуры в "нижней" границе времени ниже порога и с группировкой агрегации значении времени.
2. Полученные периоды опять соединяем с первичной таблицей данных, чтобы сместить "нижнюю" границу выше времени порога.
3. После чего уже считаем время по каждому периоду.
43. Release 14.10.21 12:47 Сейчас в теме
(37) Ну, не так уж много и ВТ получилось:
ВЫБРАТЬ
	ИсходнаяТаблица.Время,
	ИсходнаяТаблица.Температура
ПОМЕСТИТЬ втИсходнаяТаблица
ИЗ
	&ИсходнаяТаблица КАК ИсходнаяТаблица
;

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

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

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

Вместо параметра с ТЗ "&ИсходнаяТаблица" нужно подставить свою таблицу как источник данных.
Результат с примера из шапки ниже, можете протестировать на других.
Прикрепленные файлы:
42. Ligret 14.10.21 12:46 Сейчас в теме
"ВЫБОР КОГДА 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
44. Release 14.10.21 12:52 Сейчас в теме
(42) Это всё ОК потому, что предыдущие две записи по температуре в сумме равны 3-й с минусом. А что будет, если перед ней будет 3, а не 2 как сейчас?
45. Release 14.10.21 12:54 Сейчас в теме
(42) Или как оно будет работать с примером, который я привел в (36) ?
48. Ligret 14.10.21 13:14 Сейчас в теме
(45)
как оно будет работать с примером, который я привел в (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 сек)
49. Release 14.10.21 13:24 Сейчас в теме
(48) И где же тут косяк только в первой, если и без неё у вас время в минус уходит? Конечно можно ограничить значение "снизу" нулем, но это не очень хорошее решение, хотя и возможное.
Таже проблема будет, если значение меньше порога будет последним.
Например:

09:17:15 110 - 15
09:17:30 111 - 15
09:17:45 112 - 15
09:18:00 109 - -30

Вместо 30 секунд будет 15.
50. Release 14.10.21 13:26 Сейчас в теме
(48) Вообще я вам уже дал почти готовое решение в (43) .
Так, что пока не вижу, что мне тут ещё можно обсуждать, кроме возможных ошибок в нём.
51. Ligret 14.10.21 13:32 Сейчас в теме
(50)
Вообще я вам уже дал почти готовое решение


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

Премного благодарен!
52. Ligret 14.10.21 15:56 Сейчас в теме
53. Release 14.10.21 16:03 Сейчас в теме
(52) покажите исходную таблицу, я проверю.
Оставьте свое сообщение
Вопросы с вознаграждением
Вакансии
Программист, аналитик, эксперт 1С
Санкт-Петербург
По совместительству

Программист 1С
Москва
зарплата от 150 000 руб. до 200 000 руб.
Полный день

Ведущий разработчик 1С
Москва
зарплата от 250 000 руб.
Полный день

Руководитель проектов 1С
Москва
зарплата от 200 000 руб.
Полный день

Программист 1С
Москва
зарплата от 150 000 руб.
Полный день