小编典典

MSSQL 2008:按特定字段获取最后更新的记录

sql

我有一个Content在MSSQL中调用的简化表:

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

我要实现的目标如下:

从表中获取每一行ContentFileID与之前的版本相比,该表中的行已更新。结果应如下所示:

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)功能”状态。
  • 试图将我的头缠在游标上,但是由于我对此很陌生,所以我找不到运行中的解决方案。
  • 很多嵌套查询,呃…由于每次更新都会创建一个新行,因此我认为由于性能原因,嵌套查询不是可行的方法。

阅读 247

收藏
2021-05-16

共1个答案

小编典典

在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;
2021-05-16