|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Разница двух соседних записей одного поля с результатом в вычисляемое поле
Добрый день
Помогите решить следующую задачу Имеется таблица БД Access с полями: key (ключевое поле)Date, V 1 01.01.2014 0 2 02.01.2014 145 3 03.01.2014 302 4 04.01.2014 458 5 05.01.2014 621 Date - дата, V - показания счетчика воды Как с помощью ADOQuery создать вычисляемое поле, в каждой записи которого будет разница значений следующей записи поля V (если она есть) и текущей записи поля V? Под соседними записями подразумевается две соседние даты. Я делаю SQL-запрос, а при выводе в таблицу EhGrid сортирую по возрастанию даты. Результат должен получиться такой: key (ключевое поле), Date, V, dV 1 01.01.2014 0 145 2 02.01.2014 145 157 3 03.01.2014 302 156 4 04.01.2014 458 163 5 05.01.2014 621 dV - вычисляемое поле со значением суточного потребления воды Заранее спасибо за помощь Последний раз редактировалось chugastr, 27.02.2014 в 13:43. |
#2
|
|||
|
|||
Ну, например, с помощью Window Functions. Хотя что-то я не уверен, что Access их поддерживает. Соответсвенно, придется извращаться с self-join. В общем, проблема в том, что порядок записей в возвращаемом результате никто не гарантирует. Поэтому клиентский код будет для таких вычислений проходиться по всей таблице для поиска нужной записи, либо сортировка (нужная) будет "прибита гвоздями". Ни один из этих вариантов не является хорошим.
|
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
chugastr (03.03.2014)
|
#3
|
||||
|
||||
Если задача позволяет, можно делать этот пересчет при вставке новой записи
з.ы. Почему-то приходит на ум функция avg, может в дальнейшем поможет) Я за здоровый экстрим! Спасибо за "спасибо") |
Этот пользователь сказал Спасибо Mrak за это полезное сообщение: | ||
chugastr (03.03.2014)
|
#4
|
|||
|
|||
Под следующей надо понимать запись, у которого дата на сутки больше. Через SELECT делается просто.
|
#5
|
|||
|
|||
Цитата:
А можно по-подробнее, как сформировать нужный SQL-запрос с Select? А то я в этом вопросе совсем слаб Последний раз редактировалось chugastr, 27.02.2014 в 13:50. |
#6
|
||||
|
||||
попробуй так
Код:
SELECT t.key, t.date, t.v, (COALESCE(t1.v, 0) - t.v) dv FROM table t LEFT JOIN table t1 ON t1.key = t.key + 1 Поживу - увижу, Доживу - узнаю, Выживу - учту. [P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
|
Этот пользователь сказал Спасибо Yurk@ за это полезное сообщение: | ||
chugastr (03.03.2014)
|
#7
|
|||
|
|||
Цитата:
Попробовал так, но не получилось. При Datamodule1.ADOQuery1.Activ:=true, выдает ошибку "Неопознанная ошибка" |
#8
|
||||
|
||||
Цитата:
PHP код:
|
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
chugastr (03.03.2014)
|
#9
|
|||
|
|||
Цитата:
Спасибо за помощь При таком запросе выдает "Ядро базы данных Microsoft Jet не может найти входную таблицу или запрос 'table'". Если убираю [table], то тогда так же ругается на t1. А вообще, поле dV в БД я должен вручную создать или это вычисляемое поле, которое создается только во время запроса? Таблица t1 виртуальная, или ее надо предварительно создать в БД? Нужно ли прописывать что-то в процедуре события OnCalcFields? Программу пишу в Delphi 7, компонент TADOQuery. Поставщик OLE DB: Microsoft Jet 4.0 OLE DB Provider Последний раз редактировалось chugastr, 03.03.2014 в 17:58. |
#10
|
|||
|
|||
Вместо [table] нужно подставить Вашу таблицу
|
#11
|
|||
|
|||
Цитата:
|
#12
|
||||
|
||||
Цитата:
У тебя что, действительно в базе данных у этой таблицы имя "t"? Если так, то тебе в качестве алиасов нужно использовать другие слова, например: PHP код:
|
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
chugastr (03.03.2014)
|
#13
|
|||
|
|||
Цитата:
Да, я протупил Получилось! Большое человеческое спасибо! А где можно почитать по синтаксису и командам/функциям SQL для чайников? |
#14
|
|||
|
|||
Если шаг между записями один день, то запрос будет таким:
t1.date = t.date + 1 это получилось А если шаг между записями будет один час, то как будет выглядеть запрос? Что надо написать вместо "+ 1" ? key (ключевое поле)Date, V 1 01.01.2014 01:00:00 0 2 01.01.2014 02:00:00 145 3 01.01.2014 03:00:00 302 4 01.01.2014 04:00:00 458 5 01.01.2014 05:00:00 621 |