0

我有一个名为MyHistory我的历史的表,该表中有大约 1000 行,性能充其量是糟糕的。

我想要做的是选择显示下一行的行作为结果。这可能是一个不好的例子。

这是 MyHistory 结构ID int,DateTimeColumn datetime,ValueResult decimal (4,2)

我的表有以下数据
ID|DateTimeColumn|ValueResult
1|8/1/2005 1:01:29 PM|2
1|8/1/2006 1:01:29 PM|3
1|8/1/2007 1:01:29 PM|5
1|8/1/2008 1:01:29 PM|9

我想要做的是从中选择以下数据
ID|DateTimeColumn|ValueResult|ChangeValue
1|8/1/2008 1:01:29 PM|9|4
1|8/1/2007 1:01:29 PM|5|2
1|8/1/2006 1:01:29 PM|3|1
1|8/1/2005 1:01:29 PM|2|

您会注意到 ID 是 = ID 并且 datetime 列现在是 desc。那是容易的部分。但是我如何根据接下来的日期时间制作一个自引用表(以计算价值差异)?

谢谢!

4

1 回答 1

0

所以,任务是:

  • DateTimeColumn降序排列记录,
  • 为每条记录设置序列号以识别下一条记录,
  • 计算所需的价值差异。

这是许多可能的解决方案之一:

-- Use CTE to make intermediate table with sequence numbers - ranks
;WITH a (rank, ID, DateTimeColumn, ValueResult) AS
(
    select rank() OVER (ORDER BY m.DateTimeColumn DESC) as rank, ID, DateTimeColumn, ValueResult
    from MyHistory
)
-- Select all resulting columns
select a1.ID,
       a1.DateTimeColumn,
       a1.ValueResult,
       a1.ValueResult - a2.ValueResult as ChangeValue    -- Difference between current record and next one
  from a a1
      join a a2
          on a2.rank = a1.rank + 1   -- linking next record to each one
于 2013-10-14T20:57:31.440 回答