Sql server 显示数据更改历史记录的SQL查询

Sql server 显示数据更改历史记录的SQL查询,sql-server,sql-server-2008-r2,Sql Server,Sql Server 2008 R2,我在SQL Server数据库中有一个表,它每天存储历史数据。结构如下图所示: UploadDate TypeID Value1 Value2 ------------------------------------------- 2012-01-08 1 NEG 1998-02-05 2012-01-08 2 NEG 1999-02-09 2012-01-08 3 STABLE 1997-

我在SQL Server数据库中有一个表,它每天存储历史数据。结构如下图所示:

UploadDate    TypeID    Value1   Value2
-------------------------------------------
2012-01-08    1         NEG      1998-02-05
2012-01-08    2         NEG      1999-02-09
2012-01-08    3         STABLE   1997-02-06
2012-02-08    1         NEG      1998-02-05
2012-02-08    2         NEG      1999-02-09
2012-03-08    1         POS      2012-03-08
2012-03-08    2         STABLE   2012-01-08
正如您在上文中看到的
TypeID
1和
Value1
Value2
在2012-03-08发生了变化

我的要求是,我必须只显示那些从以前的值更改的行

在这种情况下,由于
TypeID
1和2发生了变化,因此它应该显示当前值和最接近的先前值。对于
TypeID
3,由于它没有改变,它将只显示最新的值。结果集如下所示:

UploadDate    TypeID    Value1   Value2
-------------------------------------------
2012-01-08    3         STABLE   1997-02-06
2012-02-08    1         NEG      1998-02-05
2012-02-08    2         NEG      1999-02-09
2012-03-08    1         POS      2012-03-08
2012-03-08    2         STABLE   2012-01-08

知道如何使用SQL解决这个问题吗?

无灵感版本在有序集上使用自连接来检查按时间顺序排列的同一typeid的前一行的值。如果没有上一行或值不同,则输出该行

; with numbered as (
  select *,
         row_number() over (order by typeid, uploaddate) rn
    from table1
)
select n1.*
  from numbered n1
  left join numbered n2
    on n1.TypeID = n2.TypeID
   and n1.rn + 1 = n2.rn
 where (n2.rn is null 
    or n1.value1 <> n2.value1
    or n1.value2 <> n2.value2)
 order by typeid, uploaddate

.

还是不清楚你想要什么,伙计?少了点什么。。。排除前两行的标准是什么?该标准仅显示特定typeID与以前值之间的最新更改。(CONVERT(TEXT,typeID)+Value1)是唯一标识符吗?请再次以粗体形式参考我的问题。哇……这真是惊人的东西。正是我想要的。非常感谢NIkola@ConfusedProgrammer不客气。明天我仍将尝试生成更简单的解决方案;如果我成功了,我会让你知道的。@好吧,这是另一个版本。不是你需要它,而是我真的想这样做。@NikolaMarkovinović,你是一个超级明星。你就是那个人。这真是太神奇了。谢谢,大师!
; with numbered as (
  select *,
         row_number() over (order by typeid, uploaddate)
       - row_number() over (partition by typeid, value1, value2 
                            order by uploaddate) group_number
    from table1
)
select max(uploaddate) uploaddate, typeid, value1, value2
  from numbered
group by typeid, value1, value2, group_number
order by typeid, uploaddate