![]() |
|
Модераторы: Akina |
![]()
|
|
| Ptica |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 27.7.2004 Репутация: нет Всего: 2 |
Здравствуйте!
Проблема такая: допустим, есть таблица MyTable, в структуру которой входят дата (MyDate), некоторый показатель (MyParameter), а также другие параметры (MyField1, MyField2,...). Дата - уникальный ключ. Конечным потребителем этих данных является запрос вида
Записи хранятся за некоторый большой период времени, и в течение этого периода нет пропусков дат. Однако сам показатель MyParameter может быть NULL. Требование такое: функция fn_MyParameter должна возвращать значение показателя на заданную дату. Если же на эту дату он is NULL, то нужно рассчитать его, как среднюю величину за N предыдущих дней. Тут и возникает необходимость в рекурсии. Допустим, на 10 марта показатель is NUll. Выбираем данные за предыдущих 5 дней: на 9, 8, 7 и 5 марта данные есть, а на 6 марта опять нет. Значит, запускаем расчет этого показателя на 6 марта. И так до упора. (Предполагается, что упор в конце концов наступит.) Собственно с рекурсией проблем нет. Это я могу сделать. Но мне захотелось, чтобы в ходе расчета вычисленные значения показателя тут же вносились в таблицу, дабы потребность в рекурсии постепенно исчезла. Однако суровый сервер сказал, что внутри функции использовать UPDATE не положено. Можно ли как-то это все-таки реализовать? |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 5 Всего: 207 |
Не нужна рекурсия, достаточно нахождения максимума и минимума. Вместо Update - поставить триггер который будет проверять значение на Null при внесении записей. Кстати ключ не может быть Null так что вы делаете что-то не то.
-------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| beroal |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 212 Регистрация: 18.1.2003 Где: Украина Репутация: нет Всего: 3 |
Любопытно... Вы хотите сделать ленивые вычисления. Т.е. при запросе отсуствующего значения показателя оно рассчитывается и сохраняется в таблице, чтобы не рассчитываться второй раз. Только не всё так просто. Эти расчётные значения надо пересчитывать, если данные в таблице меняются. Например, если делается UPDATE записи за 9 марта, то надо изменить и показатель за 10 марта.
Пересчёт показателей надо делать перед выполнением запроса. Вызовом хранимой процедуры. Так по-моему будет правильней. |
|||
|
||||
| Ptica |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 27.7.2004 Репутация: нет Всего: 2 |
beroal
Да. Делать тут ленивые вычисления и правда нехорошо. Ну ладно, спасибо за обсуждение, будем считать тему закрытой. |
|||
|
||||
![]()
|
| Правила форума "MS SQL" | |
|
|
Запрещается! Публиковать ссылки и обсуждать взлом чего бы то ни было.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | MS SQL Server | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |