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

1. Ligret 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 72 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 72 14.10.21 10:56 Сейчас в теме
(4)хорошо, представим случай
1. температура очень долго не опускалась ниже граничного значения
2. температура всегда была ниже граничного значения, кроме, скажем, первого замера.
как будете определять границу?
5. nomad_irk 72 14.10.21 10:55 Сейчас в теме
(3)да собственно без разницы, если сгруппировать по часу, минуте, то можно получить количество секунд в пределах минуты и в результате суммировать количество секунд.

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

я понимаю, что вы не автор, но задавая вопросы вам, я надеюсь, автор таки прочитает все сообщения в теме и сделает правильные умозаключения.
8. ZergKRSK 129 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 129 14.10.21 11:13 Сейчас в теме
(12) а вы почему решили что это не так? Вот точно на таком же основании.
14. Release 14.10.21 11:16 Сейчас в теме
(13) Потому что, вы делаете неверное утверждение:
до 09:16:05 температура была не ниже 110

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

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

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

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

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

В общем, пусть решает сам автор, это его задача.
35. ZergKRSK 129 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 72 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 72 14.10.21 11:45 Сейчас в теме
(27)Достаточно написать просто:

температура >= 110 КАК Учитывать
34. DJ_Codebase 14.10.21 11:51 Сейчас в теме
32. nomad_irk 72 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 72 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 72 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) покажите исходную таблицу, я проверю.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот