【问题标题】:Find first rows of change in historical table查找历史表中变化的第一行
【发布时间】:2014-01-20 12:30:12
【问题描述】:

我在 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 列添加到预期结果)

【问题讨论】:

  • 查看您的预期结果,A 列中的值是否无关紧要?
  • 不,我忘记添加了。正如我在测试小提琴上方指定的那样,一列确实包含更多“产品 ID”。 t-clausen.dk 也正确地在 'partition by A' 中使用它。

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


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 2015-10-18
    相关资源
    最近更新 更多