powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вычитание значений в последовательных записях
10 сообщений из 10, страница 1 из 1
Вычитание значений в последовательных записях
    #39234224
restangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
День добрый!
Есть множество записей вида Время-Значение, хранящие соответственно значение некоего показателя в конкретный момент времени. Необходимо к каждой записи вычислить время, прошедшее до следующего измерения. То есть получить что-то вроде

Значение | Время | t[n+1]-t[n]
22 | ... 12:42:14 | 133
48 | ... 12:44:27 | 130
57 | ... 12:45:57 | 60
14 | ... 12:46:57 | ...

Только как к такому вычислению подойти не могу подступиться. Своих скромных навыков хватает чтобы вычислять это для одной записи, но учитывая их количество вариант крайне не рационален. А чтобы загуглить не могу даже сообразить как правильно обозвать то, что мне нужно. Подскажите как это можно реализовать, если вообще можно, или хотя бы под каким именем подобное действие искать...
...
Рейтинг: 0 / 0
Вычитание значений в последовательных записях
    #39234234
restangel,

показывай свой вариант.
а вообще - подзапрос с order by ... limit 1.
при наличии соответствующего индекса будет вполне себе резво выполняться.
...
Рейтинг: 0 / 0
Вычитание значений в последовательных записях
    #39234238
Int_20h
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У значения же, наверное, еще идентификатор какой-то должен быть?

select Date1, Date2, (UNIX_TIMESTAMP(Date1) - UNIX_TIMESTAMP(Date2)) from (select Время from Таблица where ЗначениеID = 1 order by Время desc limit 1) as Date1, (select Время from Таблица where ЗначениеID = 1 order by Время desc limit 1, 1) as Date2

Примерно так...
...
Рейтинг: 0 / 0
Вычитание значений в последовательных записях
    #39234944
restangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эхпоказывай свой вариант.

Код: sql
1.
2.
3.
4.
5.
6.
Select idУстройства, idГруппы_устройств, Значение, Time, Time2 From
(Select * from NodeLogs where idГруппы_устройств=3 AND idУстройства=52 AND Time='2016-05-13 13:09:34' ) as table1 
inner join 
(Select idГруппы_устройств as idГруппы_устройств2, idУстройства as idУстройства2, Time as Time2 from NodeLogs where idГруппы_устройств=3 AND idУстройства=52 AND UNIX_TIMESTAMP(Time)>UNIX_TIMESTAMP('2016-05-13 13:09:34') order by Time2 limit 1) as table2 
on 
table1.idУстройства=table2.idУстройства2 and table1.idГруппы_устройств=table2.idГруппы_устройств2;



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

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

Int_20hУ значения же, наверное, еще идентификатор какой-то должен быть?

select Date1, Date2, (UNIX_TIMESTAMP(Date1) - UNIX_TIMESTAMP(Date2)) from (select Время from Таблица where ЗначениеID = 1 order by Время desc limit 1) as Date1, (select Время from Таблица where ЗначениеID = 1 order by Время desc limit 1, 1) as Date2

Примерно так...

Ключа непосредственного нет, неявный ключ состоит из idУстройства, idГруппы и Времени. Или я не так понял? Ваш вариант как-то поприятнее смотрится, но все равно работает только для одной строки, хоть и значительно быстрее... Сделать бы его одним запросом, а то посылать 3кк запросов на сервер как-то не есть хорошо, мне кажется...)
...
Рейтинг: 0 / 0
Вычитание значений в последовательных записях
    #39235003
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
restangel,

типа

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
select N.idГруппы_устройств, N.idУстройства, `Time`
if(@_id=ta.idУстройства,
  @delta:=timestampdiff(SECOND,@base_val,`Time`)
  ,@delta:=0 + least(0,@_id:=ta.idГруппы_устройств,@base_val:=`Time`)
) AS delta
from NodeLogs N,
(select 
  @base_val:=(select `Time` 
    from NodeLogs N 
    where N.idГруппы_устройств=123 
    order by idГруппы_устройств, idУстройства, `Time` DESC)
  ,@_id:=-1
) zz
where N.idГруппы_устройств=123
order by idГруппы_устройств, idУстройства, `Time` DESC
...
Рейтинг: 0 / 0
Вычитание значений в последовательных записях
    #39236647
restangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir,

Долго пытался понять как работает этот запрос, пытался приспособить его для своей базы - не срослось... Можно мелкие пояснения добавить?)
...
Рейтинг: 0 / 0
Вычитание значений в последовательных записях
    #39237031
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
restangel, почитайте FAQ: Нумерация строк и другие вопросы про использование переменных . Там, правда, нумерация, а не расчёт разницы, но суть та же.
...
Рейтинг: 0 / 0
Вычитание значений в последовательных записях
    #39237108
restangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir,

О_о Я думаю это как раз то, что нужно, спасибо!
...
Рейтинг: 0 / 0
Вычитание значений в последовательных записях
    #39237253
restangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir,

А все таки нет... Ваши переменные натолкнули на меня на куда более простое и эффективное решение))

Код: sql
1.
2.
3.
select zz.*, @endtime:=@time1, @time1:=zz.Time from 
(select * from NodeLogs where idУстройства=10 and Time>'2016-05-14 13:35:46' order by Time DESC) as zz, 
(select @time1:='2000-01-01 00:00:00', @endtime:='2000-01-01 00:00:00') as c;



то бишь сортируем по убыванию времени и храним в time1 время из предыдущей строки.
...
Рейтинг: 0 / 0
Вычитание значений в последовательных записях
    #39238709
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
restangelто бишь сортируем по убыванию времени и храним в time1 время из предыдущей строки.а потом переходим с одного датчика на другой, и превед
Нет, если это должно работать только для одного устройства, то всё нормально. Но мне казалось, что надо выбирать сразу всю группу.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вычитание значений в последовательных записях
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]