![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SQL запрос - в каждой строке разность полей двух соседних записей [D5, IB6.x]
norman © (2003-09-25 15:06:00)
Помогите с проблемой.
Есть таблица с архивом показаний прибора в определенные моменты времени. Нужно определить разности показаний двух соседних записей.
Как построить SQL запрос(если можно), чтобы в каждой строке получить разность значений полей соседних записей.
Заранее благодарю за внимание.
norman (2003-09-25 22:35:00) [1]
У МЕНЯ ВСЕ ПОЛУЧИЛОСЬ!!!
Если интересно, опишу задачу подробнее.
Есть архив показаний счетчика электроэнергии.
Структура таблицы (упрощенно):
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 DTMINTO
: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
Всех благодарю за участие.
MsGuns (2003-09-25 17:21:00) [2]
Если данных за раз выбирается не много (типа отчета), а подсчет нужен межстрочный, то есть и такой способ.
Делаешь выборку чего надо + добавляешь поля для промежуточных расчетов, если необходимо. Он упорядочивается чтоб записи следовали как надо для алгоритма подсчетов.
Делаешь запрос редактируемым (через связку TIBQuery+TIBUpdateSQL)
Простым сканированием с логикой смены группы вычисляешь что тебе надо.
Далаешь этот датасет входящим для репорта или суешь в грид для визуализации возможных правок узером.
stud (2003-09-25 16:07:00) [3]
а сколько вообще записей для одного прибора
Kinda (2003-09-25 15:41:00) [4]
пардон,
RAZNOST=DATCHIK1-DATCHIK2;
вроде все.
Kinda (2003-09-25 15:35:00) [5]
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
что-то типа этого?
Johnmen (2003-09-25 15:33:00) [6]
>norman
Приведи пример исходных данных в табл. и итоговых получаемых данных.
Vlad (2003-09-25 15:29:00) [7]
Братцы, вы о чем ? Соседство записей должно чем-то определяться.
Например следующая, по номеру ID, или следующая по алфавиту или по времени, или как-то еще. Вот что первым делом определить нужно.
norman (2003-09-25 15:25:00) [8]
To Smashich.
А можно для тех кто на бронепоезде:) приблизительный пример.
Если не ясны подробности по базе, задавайте уточняющие вопросы.
Smashich (2003-09-25 15:18:00) [9]
пардон. записей. тогда хп. вычисляешь все что нужно.
norman (2003-09-25 15:17:00) [10]
А как в нем сослаться на значения одного и того же поля двух разных записей таблицы?
Vlad (2003-09-25 15:15:00) [11]
Критерий соседства записей ?
Smashich (2003-09-25 15:07:00) [12]
вычисляемое поле//