Как посчитать mysql запросом разницу чисел двух ближайших строк в столбце?

таблица `nspcl`

----------
id | partnum
----------
1 | 7079626
2 | 7079623
3 | 7079593
4 | 7079552
.....

нужно посчитать разницу между ближайшими с конца, то есть
7079552 - 7079593 = -41
7079593 - 7079623 = -30
7079623 - 7079626 = -3

можно ли реализовать это mysql запросом?
  • Вопрос задан
  • 4080 просмотров
Решения вопроса 3
idShura
@idShura
Можно с помощью оконных функций

SELECT partnum,
       LAG(partnum) OVER w AS 'prev_partnum',
       partnum - LAG(partnum)  OVER w AS 'diff' 
  FROM nspcl
WINDOW w AS (ORDER BY id);
Ответ написан
Комментировать
@profaller
Если у вас id без пропусков идут, то просто джоиним к выборке id-1. Если с пропусками, то чуть посложнее запрос будет.

Вот так если ид по-порядку, например:

SELECT 
 t2.partnum p2,
 t1.partnum p1,
 t2.partnum - t1.partnum res
FROM nspcl t1 
INNER JOIN nspcl t2 ON t1.id = (t2.id - 1)
Ответ написан
Комментировать
@mletov
Какая версия MySql ? Если 8, то через оконные функции задача решается на раз
https://dev.mysql.com/doc/refman/8.0/en/window-fun...

Примерно так

SELECT t1.num, t2.num, t2.num-t1.num
FROM
(
       SELECT num,
                  ROW_NUMBER() OVER(ORDER BY num) AS rn
      FROM table
) AS t1
LEFT JOIN
(
       SELECT num,
                  ROW_NUMBER() OVER(ORDER BY num) AS rn
      FROM table
) AS t2
ON t1.rn=t2.rn-1


Сразу скажу, что работоспособность не проверял и писал в синтаксисе MSSQL, просто обозначаю идею
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
dimonchik2013
@dimonchik2013
non progredi est regredi
"два конца, два кольца, по-середине - гвоздик" - "очки фраеру прибили"


посчитать можно, только мускуль не знает про концы ничего, поэтому в запросе нужна упорядоченная последовательность (ну айди который аутоинкремент) и трехэтажные выражения

с грамотным ID можно и покороче
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы