0

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

InvNo int
InStock int
AdjustedOn datetime

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

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

我以前做过这个,我知道这并不复杂,但是今天早上在合理的时间内记住如何做有点麻烦。

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

4

2 回答 2

1

什么版本的 SQL?

  • 2012,看看 LAG 和 LEAD 函数
  • 2008,看ROW_NUMBER函数
  • 2005 年或更早,自联接是您唯一的选择
于 2013-09-26T15:54:20.873 回答
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)
于 2013-09-26T15:34:18.400 回答