Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
1-51304
kosm
2003-10-06 11:13
2003.10.16
Класс как параметр и перегрузка конструктора


6-51387
AlexLP
2003-08-19 10:55
2003.10.16
Автоподключение и автоотключение к Интернет.


3-51153
gs
2003-09-24 02:25
2003.10.16
Подскажите, что мождно реально сделать РАЗРОСТАЕТСЯ база Access


1-51175
DeScriptor
2003-10-02 23:34
2003.10.16
Как бороться с null-terminated строками


6-51368
Kaginava
2003-08-21 15:20
2003.10.16
Sokcet





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский