将日志条目与上一个条目进行比较

时间:2013-09-26 15:28:42

标签: sql-server self-join

我有一张表跟踪库存变化,其中包含以下字段:

InvNo int
InStock int
AdjustedOn datetime

我正在尝试编写一个查询,该查询将返回不同的InvNo值,其中最近的InStock值比给定InvNo的最后一个InStock值大至少10个。

我也试图写一个类似的查询来做同样的事情,但是对于InvNo,其中任何InStock值比前一个值大10 /小。

我之前已经这样做了,我知道这并不复杂,但是在今天早上记得如何在合理的时间内完成它时会遇到一些麻烦。

编辑:表格中没有Id字段,但如果可以使查询更容易,我可以添加一个。

2 个答案:

答案 0 :(得分:1)

你必须做一个自我连接,在sql查询中包含最新的行以及当前的行......

Select c.InvNo, c.inStock current, r.InStock Previous
From table c join table r 
    on r.invNo = c.invNo
       And r.AdjustedOn =
         (Select Max(AdjustedOn)
          From table 
          Where invNo = c.InvNo
            And adjustedOn < c.AdjustedOn)
Where c.InStock >= r.Instock + 10 Or
      c.Instock <= r.Instock - 10

这为您提供了该时间点的更改的所有行,与之前的更改相比为10或更多,但它包括过去在最近更改之前发生的更改。如果您希望查询仅包含表示最新更改的行,则将另一个谓词子查询添加到外部sql ...

Select c.InvNo, c.inStock current, r.InStock Previous
From table c join table r 
    on r.invNo = c.invNo
       And r.AdjustedOn =
         (Select Max(AdjustedOn)
          From table 
          Where invNo = c.InvNo
            And adjustedOn < c.AdjustedOn)
Where (c.InStock >= r.Instock + 10 Or
       c.Instock <= r.Instock - 10)
  And c.AdjustedOn =
    (Select Max(AdjustedOn)
     From table 
     Where invNo = c.InvNo)

答案 1 :(得分:1)

什么版本的SQL?

  • 2012,查看LAG和LEAD功能
  • 2008,查看ROW_NUMBER函数
  • 2005或更早,自联接是您唯一的选择