Russian Qt Forum
Май 05, 2024, 14:21 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Разность между соседними записями  (Прочитано 6448 раз)
SibBear
Гость
« : Август 22, 2012, 15:58 »

Здравствуйте. Есть таблица:
Код
SQL
id  value
1   10000
2   20000
3   50000
4   75000
5   120000
 
Как с помощью запроса получить таблицу разностей между соседними записями такого вида:

10000
30000
25000
45000

т.е. value(x+1) - value(x) ?

(БД SQLite)
« Последнее редактирование: Август 22, 2012, 16:02 от SibBear » Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #1 : Август 22, 2012, 16:41 »

Боюсь, что одним только SQL запросом - никак. Через ХП можно сделать если БД поддерживает серверные курсоры, но в SQLite насколько я помню нет ни первого, ни второго. Пишите ручками.
Записан
SibBear
Гость
« Ответ #2 : Август 22, 2012, 16:56 »

Спасибо.
Записан
fte
Гость
« Ответ #3 : Август 22, 2012, 17:29 »

Цитировать
Боюсь, что одним только SQL запросом - никак. Через ХП можно сделать если БД поддерживает серверные курсоры, но в SQLite насколько я помню нет ни первого, ни второго. Пишите ручками.
Шокированный
Код
SQL
SELECT t2.value-t1.value FROM test t1 JOIN test t2 ON(t2.id = t1.id+1);
Записан
SibBear
Гость
« Ответ #4 : Август 22, 2012, 18:02 »

Спасибо большое.Но id не обязательно следуют друг за другом... видимо, стоит создать дополнительную таблицу.
Записан
SibBear
Гость
« Ответ #5 : Август 22, 2012, 18:09 »

Цитировать
Боюсь, что одним только SQL запросом - никак. Через ХП можно сделать если БД поддерживает серверные курсоры, но в SQLite насколько я помню нет ни первого, ни второго. Пишите ручками.
Шокированный
Код
SQL
SELECT t2.value-t1.value FROM test t1 JOIN test t2 ON(t2.id = t1.id+1);

А так: on(t1.value<(select value from t2 where t2.value>t1.value limit 1)) - прокатит?
« Последнее редактирование: Август 22, 2012, 18:20 от SibBear » Записан
fte
Гость
« Ответ #6 : Август 22, 2012, 18:22 »

Цитировать
... Или так: on(t1.value<(select value from t2 where t2.value>t1.value limit 1)) - прокатит?
Нет

Цитировать
Но id не обязательно следуют друг за другом...
Это как? поясните....

Думаю вот так.
Код
SQL
SELECT t2.value-t1.value FROM test t1 JOIN test t2 ON(t2.id = (SELECT id FROM test WHERE id > t1.id ORDER BY id LIMIT 1 ) )

PS: На postgresql работает, на SQLite не знаю.....
Записан
SibBear
Гость
« Ответ #7 : Август 22, 2012, 18:48 »


Цитировать
Но id не обязательно следуют друг за другом...
Это как? поясните....
Я имею в виду, что в реальности это - выборка, и соседние id могут различаться более чем на 1.

Цитировать
Думаю вот так.
Код
SQL
SELECT t2.value-t1.value FROM test t1 JOIN test t2 ON(t2.id = (SELECT id FROM test WHERE id > t1.id ORDER BY id LIMIT 1 ) )

PS: На postgresql работает, на SQLite не знаю.....
Спасибо, работает на SQLite!
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #8 : Август 23, 2012, 08:27 »

Действительно так работать будет. Но нужно понимать во что это запрос развернется на уровне СУБД в плане производительности.
Записан
SibBear
Гость
« Ответ #9 : Август 23, 2012, 10:45 »

В данном случае производительность не критична.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.067 секунд. Запросов: 22.