在历史表中查找第一行更改

时间:2014-01-20 12:30:12

标签: sql sql-server-2008 group-by

我在MS SQL Server 2008中有一个旧的遗留表需要清理。表包含多个产品的每日行及其每日更改参数。填充表的过程未经过优化,并且每天都要重复行,只应注明更改。

现在我已经修复了每日过程以仅插入更改的值,但现在我需要清理原始表。

我的计划是仅提取相关行(其中更改为MIN(C)Group By B)并将它们插入新表并使用此新表。我尝试使用RANK()但没有成功,因为随着时间的推移,更改参数会重复,因此Group By无效。

这就是它的样子(A列有多个值,123,345,567等,所以它也需要在一个组中):

测试小提琴http://sqlfiddle.com/#!3/0da5a/3

A    B    C
123  0    20130101
123  0    20130102
123  1    20130103
123  1    20130104
123  0    20130105
123  2    20130106
123  2    20130107
123  2    20130108
123  0    20130109
123  3    20130110
123  3    20130111
123  3    20130112

预期结果是:

123 0 20130101
123 1 20130103
123 0 20130105
123 2 20130106
123 0 20130109
123 3 20130110

(编辑:在预期结果中添加了A列)

1 个答案:

答案 0 :(得分:1)

CREATE TABLE T1 (A decimal(8,0), B int, C decimal(8,0))
INSERT INTO T1 (A, B, C) VALUES (123, 0, 20130101),
(123, 0, 20130102),(123, 1, 20130103),
(123, 1, 20130104),(123, 0, 20130105),
(123, 2, 20130106),(123, 2, 20130107),
(123, 2, 20130108),(123, 0, 20130109),
(123, 3, 20130110),(123, 3, 20130111),
(123, 3, 20130112),(123, 3, 20130113)


;with x as
(
  select t1.A, t1.B, t1.C, 
  row_number() over (partition by a order by c) rn 
  from T1
)
select x1.A, x1.B, x1.C 
from x x1
left join x x2
on x1.rn = x2.rn +1 and x1.A = x2.A
where x2.A is null
or x1.B <> x2.B

结果:

A   B   C
123 0   20130101
123 1   20130103
123 0   20130105
123 2   20130106
123 0   20130109
123 3   20130110