我们正在尝试删除系统的每日供稿中提供的表格中的数据并对其进行排名。示例数据当然不是实际产品,但可以清楚地表示概念。
每日插入:
清理和排名:
我们现在正尝试删除第一个值和最后一个值之间的组中重复值的记录
我们还希望为代表该组中唯一值的第一个和最后一次出现的记录设置标识符。
样本数据:
我发现照片是显示数据,显示需要和不需要的东西的最简单方法-我希望这可以使照片变得更简单而不是晦涩。
在示例数据中:
更新表集03/12/17 = 0(第一个),06/12/17 = 1(最后)
“ sierra”只是另一个扩展的数据示例,我们希望保留16/12/16和12/11/16的记录。
结论:
使用伪代码,这是总体目标:
更新的表值:
23 ridgerapp blue 25 03/12/17 0
23 ridgerapp blue 25 06/12/17 1
57 sierra red 15 12/06/16 0
57 sierra red 15 12/11/16 1
答案 0 :(得分:0)
我将通过CTE
窗口函数使用row_number()
来查找每个 group 的第一行和最后一行,然后对其进行更新。
您未指定是什么使 group 成为 group ,所以我仅基于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 |
+----+-----------+-------+-------+------------+------+