Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Триггер на расчет разницы предыдущего значения и текущего  [new]
prazac
Member

Откуда: Казань
Сообщений: 5
Не получается повесить запрос на триггер.
Имеется таблица TAB_1, DELTA_OI(n)=OI(n)-OI(n-1):

ID OI DELTA_OI
1 510518 0
25105191
35105201
451053010
5510500-30
65105000
75105000


Запрос:

SELECT ID, OI, 
(OI - LAG(OI,1,OI) OVER (ORDER BY DELTA_OI)) AS [DELTA_OI]
FROM TAB_1;


Возможно можно как то сделать по другому, но требуется расчет поля DELTA_OI в автоматическом режиме, по мере добавления новой строки.
Не судите строго я новичок, SQL увидел первый раз неделю назад.
MSSQL 2014.
6 фев 16, 20:01    [18782316]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на расчет разницы предыдущего значения и текущего  [new]
aleks2
Guest
Даже если представить, что ты добавляешь строку в середину таблицы, надобно рассчитать всего ДВА значения.
Нахера ж ты всю таблицу колбасишь?
6 фев 16, 20:17    [18782359]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на расчет разницы предыдущего значения и текущего  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51229
prazac
Возможно можно как то сделать по другому, но требуется расчет поля DELTA_OI в автоматическом режиме, по мере добавления новой строки.

Поле DELTA_OI из таблицы выкинь, саму таблицу переименуй, на её месте создай вьюху со старым именем и твоим запросом внутри.
6 фев 16, 20:30    [18782409]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на расчет разницы предыдущего значения и текущего  [new]
prazac
Member

Откуда: Казань
Сообщений: 5
Dimitry Sibiryakov
prazac
Возможно можно как то сделать по другому, но требуется расчет поля DELTA_OI в автоматическом режиме, по мере добавления новой строки.

Поле DELTA_OI из таблицы выкинь, саму таблицу переименуй, на её месте создай вьюху со старым именем и твоим запросом внутри.


OK. Я так понимаю "вьюха" это представление? Сяду за книжки...
6 фев 16, 20:44    [18782473]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на расчет разницы предыдущего значения и текущего  [new]
prazac
Member

Откуда: Казань
Сообщений: 5
prazac
Dimitry Sibiryakov
пропущено...

Поле DELTA_OI из таблицы выкинь, саму таблицу переименуй, на её месте создай вьюху со старым именем и твоим запросом внутри.


OK. Я так понимаю "вьюха" это представление? Сяду за книжки...


Я конечно возможно не правильно понял, но какой толк для автоматизации расчета поля DELTA_OI от представления? Эта такая же таблица, с тем же запросом, не понятно...
У меня за 1 день залетает около миллиона строк, мне каждая запись важна для дальнейших расчетов (больше 100 записей в секунду).
6 фев 16, 22:30    [18782806]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на расчет разницы предыдущего значения и текущего  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
prazac,

триггер instead of, берите данные по IDENT_CURRENT, ищите разницу c inserted.
Если гарантируете вставку по одной штуке. Блокируйте таблицу, чтобы была очередь при вставке.
8 фев 16, 11:39    [18786502]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на расчет разницы предыдущего значения и текущего  [new]
Glory
Member

Откуда:
Сообщений: 104760
prazac
Я конечно возможно не правильно понял, но какой толк для автоматизации расчета поля DELTA_OI от представления?

Толк в том, что при обращении якобы к таблице, на самом деле будет выполняться запрос

SELECT ID, OI,
(OI - LAG(OI,1,OI) OVER (ORDER BY DELTA_OI)) AS [DELTA_OI]
FROM TAB_1;

который, по вашим словам, уже рассчитывает все, что нужно
8 фев 16, 11:45    [18786556]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на расчет разницы предыдущего значения и текущего  [new]
mishanya3624
Member

Откуда:
Сообщений: 795
Только вы ничего не вставляете, а каждый раз заставляете сервер считать вашу разницу, чтобы показать нужный результат.
Создайте отдельную таблицу, или добавьте еще 1 столбец в существующую и insert'ите туда с помощью триггера ваши изменения с помощью after insert.
8 фев 16, 13:54    [18787411]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на расчет разницы предыдущего значения и текущего  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51229
mishanya3624
Создайте отдельную таблицу, или добавьте еще 1 столбец в существующую и insert'ите туда с помощью триггера ваши изменения с помощью after insert.

...и тем самым уроните производительность вставок под плинтус.

Хорошее предложение, да...
8 фев 16, 14:38    [18787820]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на расчет разницы предыдущего значения и текущего  [new]
mishanya3624
Member

Откуда:
Сообщений: 795
Dimitry Sibiryakov,

почему под плинтус?
8 фев 16, 14:42    [18787847]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на расчет разницы предыдущего значения и текущего  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
prazac,

Вам надо начать с том, что разобраться в теме "медленно изменяющиеся измерения 2"

https://yandex.ru/search/?lr=213&msid=22888.15264.1454937649.50273&text=медленно изменяющиеся измерения 2

На SQL 2014 есть функция LAG, которая позволяет легко получить значение предыдущего дня. Вставлять такие значения "на лету" не всегда правильное решение. Надо вставить, а потом просчитать привязку к исторической записи.
8 фев 16, 16:23    [18788607]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить