LINUX.ORG.RU

запрос к бд разницы между значениями

 


0

1

Добрый день. Возможно я просто не знаю ключевое слово, по которому гуглить, подскажите пожалуйста, существует ли какой-либо стандартный метод для такого случая:

+-----+-----+
| id  | val |
+-----+-----+
| 1   |  2  |
| 2   |  4  |
+-----+-----+
необходимо найти val[2]-val[1], т.е. 4-2=2
субд mysql
заранее спасибо

★★★

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

Надо связать её с самой собой (с разными псевдонимами).

select t1.id, t2.val - t1.val
from tbl t1 right join tbl t2 on (t1.id=t2.id-1)

UPD: Если прям так не прокатит, то через view.

UPD2: может лучше left join и вырезать null'евые значения.

ziemin ★★
()
Последнее исправление: ziemin (всего исправлений: 2)
Ответ на: комментарий от ziemin

в табличке планируется до 30.000.000 строк (сейчас ~200.000). Подойдет ли данный метод к такому объему?

disee ★★★
() автор топика
Ответ на: комментарий от disee

зависит от того, как часто нужно проделывать такой трюк. если это какой-то недельный отчёт, то 30Мстрок не так много.

кстати, чуть не забыл - значения точно будут на 1 отличаться? удалять строки не собираешься?

иначе нужна промежуточная таблица. а уда уже можно запихать готовую разницу и править её триггерами (и таблицу и поле суммы) //ziemin

anonymous
()

30 миллионов x 30 миллионов - приличный джойн получится =)

Вообще это называется оконные функции - можно достать всю выборку за один проход без всяких джойнов, но mysql их насколько я знаю не умеет:

SELECT id,val,val-lag(val) over client_window as diff from test WINDOW client_window as (order by id) ORDER BY id DESC;
 id | val | diff 
----+-----+------
  3 |   7 |    3
  2 |   4 |    2
  1 |   2 |     
(3 строки)

disarmer ★★★
()

Чем плохо сделать два запроса и самому найти разницу?

sdio ★★★★★
()
Ответ на: комментарий от sdio

id могут быть произвольными

Тогда непонятно, по какому вообще принципу выбираются уменьшаемое и вычитаемое?

Apple-ch ★★
()

запроси в google «mysql нарастающий итог» - это именно так называется :-) по крайней мере техника построения запроса не отличается.

и тут, а ЛОР`e такой вопрос встречается не реже раз в квартал :) можно локальным поиском порыть.

MKuznetsov ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.