查找数据重置的行

Pau*_*aul 4 sql-server sql-server-2012

所以我有一个表tbl,我试图在其中提取以可变速率递增的数据。我需要确定数据何时重置,以便我可以得出一个累积值。这是一个示例表:

ID    VAL
 1     12
 2      2
 3     14
 4     20
 5     24
 6     25
 7      2
 8     11
 9     14
10     15
11     18
12      0
13      5
Run Code Online (Sandbox Code Playgroud)

如何在 SQL 查询中识别哪些行已重置数据?

在此表示例中,我想将行 ID 2、7 和 12 标识为数据重置的点。

最终结果是,我可以将第 1、6 和 11 行(以及其他数据)添加到当前值以获得总累积值。

Aar*_*and 7

;WITH x AS 
(
  SELECT ID, VAL, Prev_VAL = LAG(VAL, 1) OVER (ORDER BY ID) 
  FROM dbo.your_table
)
SELECT ID, VAL, Prev_VAL, Cumulative = VAL + Prev_VAL
FROM x 
WHERE VAL < Prev_VAL
ORDER BY ID;
Run Code Online (Sandbox Code Playgroud)

如果您需要支持早于 SQL Server 2012(LAG()引入时)的版本,您可以这样做,但通过随意且几乎不科学的观察,它的成本约为 4 倍:

;WITH x AS 
(
  SELECT ID, VAL, Prev_ID = ROW_NUMBER() OVER (ORDER BY ID)
  FROM dbo.your_table
)
SELECT c.ID, c.VAL, p.VAL, Cumulative = c.VAL + p.VAL
FROM x AS c
LEFT OUTER JOIN x AS p
ON c.Prev_ID = p.Prev_ID + 1
WHERE c.VAL < p.VAL
ORDER BY c.ID;
Run Code Online (Sandbox Code Playgroud)