Я бы использовал CTE
с оконной функцией row_number()
, чтобы найти первую и последнюю строки для каждой группы , а затем обновить ее.
Вы не сделалиукажите, что делает группу группу , поэтому я основываю это только на ID
.Если вы хотите, чтобы группа была набором столбцов, например ID
и Color
и Value
, просто добавьте эти столбцы в список partition by
.Для выборочных данных результат будет одинаковым, но разные выборочные данные будут иметь разные результаты.
Обратите внимание, что я не включил точные строки для группы sierra, потому что я хотел показать вам, как она будет обрабатыватьдубликаты history
даты.
declare @table table (id int, [name] varchar(64), color varchar(16), [value] int, history date)
insert into @table
values
(23,'ridgerapp','blue',25,'20170312'),
(23,'ridgerapp','blue',25,'20170325'),
(23,'ridgerapp','blue',25,'20170410'),
(23,'ridgerapp','blue',25,'20170610'),
(23,'ridgerapp','blue',25,'20170612'),
(57,'sierra','red',15,'20161206'),
(57,'sierra','red',15,'20161208'),
(57,'sierra','red',15,'20161210'),
(57,'sierra','red',15,'20161210') --notice this is a duplicate row
;with cte as(
select
*
,fst = row_number() over (partition by id order by history asc)
,lst = row_number() over (partition by id order by history desc)
from @table
)
delete from cte
where fst !=1 and lst !=1
select
*
,flag = case when row_number() over (partition by id order by history asc) = 1 then 0 else 1 end
from @table
ВОЗВРАТ
+----+-----------+-------+-------+------------+------+
| id | name | color | value | history | flag |
+----+-----------+-------+-------+------------+------+
| 23 | ridgerapp | blue | 25 | 2017-03-12 | 0 |
| 23 | ridgerapp | blue | 25 | 2017-06-12 | 1 |
| 57 | sierra | red | 15 | 2016-12-06 | 0 |
| 57 | sierra | red | 15 | 2016-12-10 | 1 |
+----+-----------+-------+-------+------------+------+