Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вычитание значений в последовательных записях / 10 сообщений из 10, страница 1 из 1
12.05.2016, 12:46
    #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
12.05.2016, 12:53
    #39234234
Вычитание значений в последовательных записях
restangel,

показывай свой вариант.
а вообще - подзапрос с order by ... limit 1.
при наличии соответствующего индекса будет вполне себе резво выполняться.
...
Рейтинг: 0 / 0
12.05.2016, 12:59
    #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
13.05.2016, 10:47
    #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
13.05.2016, 11:39
    #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
16.05.2016, 15:25
    #39236647
restangel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычитание значений в последовательных записях
tanglir,

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

О_о Я думаю это как раз то, что нужно, спасибо!
...
Рейтинг: 0 / 0
17.05.2016, 12:25
    #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
19.05.2016, 05:30
    #39238709
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычитание значений в последовательных записях
restangelто бишь сортируем по убыванию времени и храним в time1 время из предыдущей строки.а потом переходим с одного датчика на другой, и превед
Нет, если это должно работать только для одного устройства, то всё нормально. Но мне казалось, что надо выбирать сразу всю группу.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вычитание значений в последовательных записях / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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