Форум: "Базы";
Текущий архив: 2003.10.16;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.01 c