Создать столбец,вычитающий предыдущее значение
Есть таблица по типу:
| id | target |
|---|---|
| 001 | 0 |
| 001 | 1 |
| 001 | 1 |
необходимо создать столбец с увеличивающимся счетчиком, начиная с отрицательных значений. При первом значении target=1, значение будет 0 и так далее. По типу:
| id | target | res |
|---|---|---|
| 001 | 0 | -1 |
| 001 | 1 | 0 |
| 001 | 1 | 1 |
при наступлении target = 1, далее других значений в таргете не будет
Есть идея по каждому id посчитать сумму по столбцу target и постепенно вычитать 1 (предварительно перевернув). Должно получиться s = s, s1 = s - 1, s2 = s1 - 1 и т.п. Но не знаю как реализовать.
Использую microsoft sql-server 2017
Ответы (2 шт):
Можно при создании таблицы назначить автоинкремент и его стартовое значение для столбца:
CREATE TABLE myTable
(
id int,
target int,
res int IDENTITY(-1,1) -- начинаем с -1, с шагом 1
)
Либо добавить в существующей
ALTER TABLE myTable ALTER COLUMN res INT IDENTITY (-1, 1);
Если нужен инкремент в зависимости от содержимого другого поля, то нужно делать триггер на вставку новой строки. Есть ответ тут (на английском)
CREATE TRIGGER ResIncrement
ON myTable
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
update myTable
set
res = (select coalesce(MAX(target), 0) - 1
from myTable r where r.id = inserted.id )
from
inserted where myTable.Id = inserted.Id
END
Использование триггеров не рекомендуются от слова совсем. Только в крайнем случае, если нет доступа к коду работающему с БД.