Russian Qt Forum

Программирование => Базы данных => Тема начата: SibBear от Август 22, 2012, 15:58



Название: Разность между соседними записями
Отправлено: 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)


Название: Re: Разность между соседними записями
Отправлено: xokc от Август 22, 2012, 16:41
Боюсь, что одним только SQL запросом - никак. Через ХП можно сделать если БД поддерживает серверные курсоры, но в SQLite насколько я помню нет ни первого, ни второго. Пишите ручками.


Название: Re: Разность между соседними записями
Отправлено: SibBear от Август 22, 2012, 16:56
Спасибо.


Название: Re: Разность между соседними записями
Отправлено: fte от Август 22, 2012, 17:29
Цитировать
Боюсь, что одним только SQL запросом - никак. Через ХП можно сделать если БД поддерживает серверные курсоры, но в SQLite насколько я помню нет ни первого, ни второго. Пишите ручками.
:o
Код
SQL
SELECT t2.value-t1.value FROM test t1 JOIN test t2 ON(t2.id = t1.id+1);


Название: Re: Разность между соседними записями
Отправлено: SibBear от Август 22, 2012, 18:02
Спасибо большое.Но id не обязательно следуют друг за другом... видимо, стоит создать дополнительную таблицу.


Название: Re: Разность между соседними записями
Отправлено: SibBear от Август 22, 2012, 18:09
Цитировать
Боюсь, что одним только SQL запросом - никак. Через ХП можно сделать если БД поддерживает серверные курсоры, но в SQLite насколько я помню нет ни первого, ни второго. Пишите ручками.
:o
Код
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)) - прокатит?


Название: Re: Разность между соседними записями
Отправлено: fte от Август 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 не знаю.....


Название: Re: Разность между соседними записями
Отправлено: SibBear от Август 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!


Название: Re: Разность между соседними записями
Отправлено: xokc от Август 23, 2012, 08:27
Действительно так работать будет. Но нужно понимать во что это запрос развернется на уровне СУБД в плане производительности.


Название: Re: Разность между соседними записями
Отправлено: SibBear от Август 23, 2012, 10:45
В данном случае производительность не критична.