Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.16;
Скачать: CL | DM;

Вниз

SQL запрос - в каждой строке разность полей двух соседних записей   Найти похожие ветки 

 
norman   (2003-09-25 15:06) [0]

Помогите с проблемой.
Есть таблица с архивом показаний прибора в определенные моменты времени. Нужно определить разности показаний двух соседних записей.
Как построить SQL запрос(если можно), чтобы в каждой строке получить разность значений полей соседних записей.

Заранее благодарю за внимание.


 
Smashich ©   (2003-09-25 15:07) [1]

вычисляемое поле//


 
Vlad ©   (2003-09-25 15:15) [2]

Критерий соседства записей ?


 
norman   (2003-09-25 15:17) [3]

А как в нем сослаться на значения одного и того же поля двух разных записей таблицы?


 
Smashich ©   (2003-09-25 15:18) [4]

пардон. записей. тогда хп. вычисляешь все что нужно.


 
norman   (2003-09-25 15:25) [5]

To Smashich.
А можно для тех кто на бронепоезде:) приблизительный пример.
Если не ясны подробности по базе, задавайте уточняющие вопросы.


 
Vlad ©   (2003-09-25 15:29) [6]

Братцы, вы о чем ? Соседство записей должно чем-то определяться.
Например следующая, по номеру ID, или следующая по алфавиту или по времени, или как-то еще. Вот что первым делом определить нужно.


 
Johnmen ©   (2003-09-25 15:33) [7]

>norman

Приведи пример исходных данных в табл. и итоговых получаемых данных.


 
Kinda   (2003-09-25 15:35) [8]

CREATE PROCEDURE RAZNOST
RETURNS(
DATA1 TIMESTAMP,
DATA2 TIMESTAMP,
RAZNOST DOUBLE PRECISION)
AS
DECLARE VARIABLE DATCHIK1 DOUBLE PRECISION;
DECLARE VARIABLE DATCHIK2 DOUBLE PRECISION;
BEGIN
/* Procedure body */
FOR SELECT ОПР_МОМЕНТ_ВРЕМЕНИ, ПОКАЗАН_ДАТЧИКА FROM TABLE INTO
:DATA1, DATCHIK1 ORDER BY ОПР_МОМЕНТ_ВРЕМЕНИ DO BEGIN
SELECT MIN(ОПР_МОМЕНТ_ВРЕМЕНИ) FROM TABLE WHERE
ОПР_МОМЕНТ_ВРЕМЕНИ>:DATA1 INTO :DATA2;
SELECT ПОКАЗАН_ДАТЧИКА FROM TABLE WHERE
ОПР_МОМЕНТ_ВРЕМЕНИ=:DATA2 INTO :DATCHIK2;
RAZNOST=DATA1-DATA2;
SUSPEND;
END
END

что-то типа этого?


 
Kinda   (2003-09-25 15:41) [9]

пардон,
RAZNOST=DATCHIK1-DATCHIK2;
вроде все.


 
stud ©   (2003-09-25 16:07) [10]

а сколько вообще записей для одного прибора


 
MsGuns ©   (2003-09-25 17:21) [11]

Если данных за раз выбирается не много (типа отчета), а подсчет нужен межстрочный, то есть и такой способ.
Делаешь выборку чего надо + добавляешь поля для промежуточных расчетов, если необходимо. Он упорядочивается чтоб записи следовали как надо для алгоритма подсчетов.
Делаешь запрос редактируемым (через связку TIBQuery+TIBUpdateSQL)
Простым сканированием с логикой смены группы вычисляешь что тебе надо.
Далаешь этот датасет входящим для репорта или суешь в грид для визуализации возможных правок узером.


 
norman   (2003-09-25 22:35) [12]

У МЕНЯ ВСЕ ПОЛУЧИЛОСЬ!!!
Если интересно, опишу задачу подробнее.
Есть архив показаний счетчика электроэнергии.
Структура таблицы (упрощенно):
CREATE TABLE LOGINFO (
NUM INTEGER NOT NULL, //номер записи
DTM TIMESTAMP, //момент добавления записи в базу
POK FLOAT,//показания счетчика в кВт*ч для момента DTM
);

Требуется построить график изменения электрической мощности в кВт.
Мощность вычисляется так: =(POK2-POK1)/(DTM2-DTM1)/24
где 1 и 2 показывают, что поля принадлежат соседним по времени записям. Деление на 24 нужно для представления разности времени в часах.

>MsGuns
Раньше задача была решена именно так как тобой предложено.
Но хотелось это все сделать на стороне SQL сервера.
Нет предела совершенству:)

>Kinda
ОСОБАЯ БЛАГОДАРНОСТЬ
Все сделал на основе предложенного примера.
Только исправил небольшую неточность: ORDER BY стоял не там.

Окончательное решение.
CREATE PROCEDURE RAZNOST
RETURNS (
DATA1 TIMESTAMP,
DATA2 TIMESTAMP,
RAZNOST DOUBLE PRECISION)
AS
DECLARE VARIABLE DATCHIK1 DOUBLE PRECISION;
DECLARE VARIABLE DATCHIK2 DOUBLE PRECISION;
BEGIN
/* Procedure body */
FOR SELECT DTM, POK FROM LOGINFO ORDER BY DTM INTO
:DATA1, :DATCHIK1 DO BEGIN
SELECT MIN(DTM) FROM LOGINFO WHERE
DTM>:DATA1 INTO :DATA2;
SELECT POK FROM LOGINFO WHERE
DTM=:DATA2 INTO :DATCHIK2;
RAZNOST=(DATCHIK2-DATCHIK1)/(DATA2-DATA1)/24;
SUSPEND;
END
END

Всех благодарю за участие.



Страницы: 1 вся ветка

Текущий архив: 2003.10.16;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.026 c
6-51376
Ups
2003-08-20 02:50
2003.10.16
Есть ли возможность


3-51073
MVVD
2003-09-25 17:06
2003.10.16
Ошибка запроса


14-51476
Yorick
2003-09-24 13:23
2003.10.16
Как можно отвоевать девушку?


14-51410
Lank
2003-09-25 23:42
2003.10.16
Опять RPC ?


14-51426
lak
2003-09-25 22:09
2003.10.16
борода ;)