MSSQL 2008:按特定字段获取上次更新的记录

时间:2014-10-15 12:03:37

标签: sql sql-server sql-server-2008

我在MSSQL中有一个名为Content的简化表:

ContentID     UpdatedAt               FileID
1             2014-01-01 00:00:00     File-A
1             2014-02-02 00:00:00     File-B
1             2014-03-03 00:00:00     File-B
2             2012-12-30 00:00:00     File-X
2             2012-12-31 00:00:00     File-Y

我想要实现的目标如下:

获取表Content中的每一行,其中FileID已更新,与之前的版本相比较。结果应如下:

ContentID     UpdatedAt               FileID
1             2014-02-02 00:00:00     File-B
2             2012-12-31 00:00:00     File-Y

到目前为止我尝试过:

  • 查找不同的解决方案并找到了LAG()函数,这似乎很有希望。但是,此功能似乎仅在MSSQL 2012中可用,因为错误"并行数据仓库(PDW)功能未启用"的状态。
  • 试图把我的脑袋包裹在光标周围,但由于我是一个菜鸟,我无法找到一个正在运行的解决方案。
  • 很多嵌套查询,呃......由于为每次更新创建了一个新行,我认为由于性能原因,嵌套查询不是可行的方法。

1 个答案:

答案 0 :(得分:2)

在SQL Server 2012中,您只需使用lag()。您可以在SQL Server 2008中以各种方式复制它。以下是使用cross apply的方法:

select c.*
from content c cross apply
     (select top 1 c2.*
      from content c2
      where c2.contentId = c.contentId and c2.UpdatedAt < c.UpdatedAt
      order by c2.UpdatedAt desc
     ) cprev
where c.FileId <> cprev.FileId;