Я впервые делаю кодирование на MS SQL, и я хочу убедиться, что я использую правильную конструкцию.
Я пишу триггер вставки, который обновит пару значений для текущей записи на основе значений из предыдущей записи.Поле Cum_cnt имеет кумулятивный счет и может сбрасываться в некоторых точках, следовательно, добавляется, если оператор else для захвата сбрасывается (когда значение ниже, чем предыдущее значение).Я вычисляю количество между записями и обновляю время начала с предыдущей записи.
Основываясь на других моих знаниях базы данных, я установил базу данных MS SQL и написал следующий триггер.Он работает, как и ожидалось, но я не уверен, если это способ записи, и это даст проблемы с производительностью, если мы обновим 7-8 полей.
create table t1 (dt datetime, cum_cnt int, cnt int, st_time datetime, ed_time datetime)
--drop trigger t1_Trg
CREATE TRIGGER t1_Trg
ON t1
AFTER INSERT
AS
DECLARE @v_prev_cnt int
DECLARE @v_curr_cnt int
DECLARE @v_prev_dt datetime
DECLARE @v_curr_dt datetime
DECLARE @v_cnt int
BEGIN
select @v_curr_cnt = i.cum_cnt, @v_curr_dt = i.dt from inserted i
select @v_prev_cnt = cum_cnt, @v_prev_dt = dt from t1 where dt = (select max(dt) from t1 where dt < @v_curr_dt)
if (@v_curr_cnt >= @v_prev_cnt)
set @v_cnt = @v_curr_cnt - @v_prev_cnt;
else
set @v_cnt = @v_curr_cnt;
UPDATE t1
SET st_time = @v_prev_dt,
ed_time = @v_curr_dt,
cnt = @v_cnt
FROM t1
where dt = @v_curr_dt
END
--delete from t1
insert into t1 (dt , cum_cnt , cnt , st_time , ed_time ) values (Convert(datetime, '2019-01-29 13:01:00.000' ), 10, NULL, NULL, NULL);
insert into t1 (dt , cum_cnt , cnt , st_time , ed_time ) values (Convert(datetime, '2019-01-29 13:05:00.000' ), 23, NULL, NULL, NULL);
insert into t1 (dt , cum_cnt , cnt , st_time , ed_time ) values (Convert(datetime, '2019-01-29 13:10:00.000' ), 27, NULL, NULL, NULL);
insert into t1 (dt , cum_cnt , cnt , st_time , ed_time ) values (Convert(datetime, '2019-01-29 13:13:00.000' ), 32, NULL, NULL, NULL);
insert into t1 (dt , cum_cnt , cnt , st_time , ed_time ) values (Convert(datetime, '2019-01-29 13:15:00.000' ), 33, NULL, NULL, NULL);
insert into t1 (dt , cum_cnt , cnt , st_time , ed_time ) values (Convert(datetime, '2019-01-29 13:17:00.000' ), 33, NULL, NULL, NULL);
insert into t1 (dt , cum_cnt , cnt , st_time , ed_time ) values (Convert(datetime, '2019-01-29 13:19:00.000' ), 41, NULL, NULL, NULL);
insert into t1 (dt , cum_cnt , cnt , st_time , ed_time ) values (Convert(datetime, '2019-01-29 13:20:00.000' ), 43, NULL, NULL, NULL);
insert into t1 (dt , cum_cnt , cnt , st_time , ed_time ) values (Convert(datetime, '2019-01-29 13:23:00.000' ), 04, NULL, NULL, NULL);
insert into t1 (dt , cum_cnt , cnt , st_time , ed_time ) values (Convert(datetime, '2019-01-29 13:26:00.000' ), 08, NULL, NULL, NULL);
insert into t1 (dt , cum_cnt , cnt , st_time , ed_time ) values (Convert(datetime, '2019-01-29 13:31:00.000' ), 11, NULL, NULL, NULL);
insert into t1 (dt , cum_cnt , cnt , st_time , ed_time ) values (Convert(datetime, '2019-01-29 13:34:00.000' ), 15, NULL, NULL, NULL);
insert into t1 (dt , cum_cnt , cnt , st_time , ed_time ) values (Convert(datetime, '2019-01-29 13:35:00.000' ), 18, NULL, NULL, NULL);
Результаты:
select * from t1
dt cum_cnt cnt st_time ed_time
2019-01-29 13:01:00.000 10 10 NULL 2019-01-29 13:01:00.000
2019-01-29 13:05:00.000 23 13 2019-01-29 13:01:00.000 2019-01-29 13:05:00.000
2019-01-29 13:10:00.000 27 4 2019-01-29 13:05:00.000 2019-01-29 13:10:00.000
2019-01-29 13:13:00.000 32 5 2019-01-29 13:10:00.000 2019-01-29 13:13:00.000
2019-01-29 13:15:00.000 33 1 2019-01-29 13:13:00.000 2019-01-29 13:15:00.000
2019-01-29 13:17:00.000 33 0 2019-01-29 13:15:00.000 2019-01-29 13:17:00.000
2019-01-29 13:19:00.000 41 8 2019-01-29 13:17:00.000 2019-01-29 13:19:00.000
2019-01-29 13:20:00.000 43 2 2019-01-29 13:19:00.000 2019-01-29 13:20:00.000
2019-01-29 13:23:00.000 4 4 2019-01-29 13:20:00.000 2019-01-29 13:23:00.000
2019-01-29 13:26:00.000 8 4 2019-01-29 13:23:00.000 2019-01-29 13:26:00.000
2019-01-29 13:31:00.000 11 3 2019-01-29 13:26:00.000 2019-01-29 13:31:00.000
2019-01-29 13:34:00.000 15 4 2019-01-29 13:31:00.000 2019-01-29 13:34:00.000
2019-01-29 13:35:00.000 18 3 2019-01-29 13:34:00.000 2019-01-29 13:35:00.000