Прежде всего, невозможно автоматически установить и обновить это значение в таблице. Их придется пересчитывать после каждой модификации таблицы, и вычисляемые столбцы не могут ссылаться на другие строки или выполнять полные запросы.
Вы можете использовать оконную функцию, такую как LAG
, чтобы проверить, существует ли предыдущее значение в наборе в соответствии с заданным вами порядком поиска, например:
declare @t table (data varchar(10))
insert into @t
values ('A'),
('B'),
('A'),
('B'),
('B'),
('C'),
('C')
SELECT
Data,
iif( lag(1) over (partition by Data order by Data) is null,1,0) as Value
FROM @t
Это вернет:
Data Value
A 1
A 0
B 1
B 0
B 0
C 1
C 0
lag(1) over (partition by Data order by Data)
разбивает строки по значениям в столбце данных и сортирует их по одному значению, в результате чего получается случайный порядок. Затем он возвращает «предыдущее» значение для этого раздела. Для первой строки ее нет, а LAG
возвращает null
.
iif( ... is null,1,0) as Value
проверяет результат и возвращает 1, если он нулевой, в противном случае 0.
Если вы хотите сохранить изменения в таблице, вы можете использовать обновляемый CTE:
declare @t table (data varchar(10),value bit)
insert into @t(data)
values ('A'),
('B'),
('A'),
('B'),
('B'),
('C'),
('C');
with x as ( SELECT
Data,value,
iif( lag(1) over (partition by Data order by Data) is null,1,0) as Val
FROM @t)
update x
set value=val
from @t;
select *
from @t
order by data
Вы можете использовать триггер на INSERT, UPDATE, DELETE, чтобы запускать этот запрос при каждой модификации и обновлять таблицу. Хотя было бы лучше сделать все изменения и выполнить UPDATE
только в конце