Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 使用SQL获取上一行数据_Sql Server 2005 - Fatal编程技术网

Sql server 2005 使用SQL获取上一行数据

Sql server 2005 使用SQL获取上一行数据,sql-server-2005,Sql Server 2005,我有一个要求,需要从上一行获取数据,以便在计算中使用,从而为当前行提供状态。这是一张历史记录表。前一行将告诉我日期字段中的数据是否已更改 我用光标查过,看起来有点复杂。这是最好的方式吗 我还尝试将一个值关联到一个新字段 newField=从表1中选择field1,其中前一行前一行是我似乎卡住的地方。我不知道如何选择当前行下的行 我正在使用SQLServer2005 提前谢谢。这实际上取决于什么告诉你一行是前一行。但是,自联接应该满足您的要求: select * from Table1 this

我有一个要求,需要从上一行获取数据,以便在计算中使用,从而为当前行提供状态。这是一张历史记录表。前一行将告诉我日期字段中的数据是否已更改

我用光标查过,看起来有点复杂。这是最好的方式吗

我还尝试将一个值关联到一个新字段

newField=从表1中选择field1,其中前一行前一行是我似乎卡住的地方。我不知道如何选择当前行下的行

我正在使用SQLServer2005


提前谢谢。

这实际上取决于什么告诉你一行是前一行。但是,自联接应该满足您的要求:

select *
from Table1 this
  join Table2 prev on this.incrementalID = prev.incrementalID+1

如果你有下表

CREATE TABLE MyTable (
   Id            INT NOT NULL,
   ChangeDate    DATETIME NOT NULL,
   .
   .
   .
)
以下查询将返回MyTable中任何记录的上一条记录


以前怎么样??基于什么临界点,什么排序顺序,什么按语句排序???SQL Server本身没有order-只有在指定order BY子句时才能获得order…请提供表结构。这在SQL Server 2005中并不简单,但您可以通过使用行号和自连接来实现……您被卡住了,因为您试图获取当前行下的行。每个人都知道前几行在当前行的上方。我用游标查找过,看起来有点复杂。这是最好的方式吗?几乎总是不知道如何定义上一行?您是在询问主键为下一个最高值的行,还是有跟踪行顺序的日期字段。您需要提供更多的信息。每一行没有唯一的ID。增量是表中内置的吗?而且我正在处理的数据是整个表的子集,因此如果有增量ID,子集可能不会按顺序排列。哇,这看起来很有希望。现在把它放好。谢谢嘿,我把它放在适当的地方,它工作得很好!!!我看到了我缺少的技能/概念。CTE工作得很好。我使用了临时表并尝试了视图,但CTE要容易得多。CTE允许您将表连接到自身,这非常有价值。再加上行数,效果非常好。谢谢你的帮助。
SELECT tbl.Id,
       tbl.ChangeDate,
       hist.Id,
       hist.ChangeDate
  FROM MyTable tbl 
       INNER JOIN MyTable hist
        ON hist.Id = tbl.Id 
       AND hiost.ChangeDate = (SELECT MAX(ChangeDate) 
                                 FROM MyTable sub 
                                WHERE sub.Id = tbl.Id AND sub.ChangeDate < tbl.ChangeDate)
-- Test data
declare @T table (ProjectNumber int, DateChanged datetime, Value int)
insert into @T 
  select 1, '2001-01-01', 1 union all
  select 1, '2001-01-02', 1 union all
  select 1, '2001-01-03', 3 union all
  select 1, '2001-01-04', 3 union all
  select 1, '2001-01-05', 4 union all
  select 2, '2001-01-01', 1 union all
  select 2, '2001-01-02', 2

-- Get CurrentValue and PreviousValue with a Changed column
;with cte as
(
  select *,
    row_number() over(partition by ProjectNumber order by DateChanged) as rn
  from @T
)
select
  C.ProjectNumber,
  C.Value as CurrentValue,
  P.Value as PreviousValue,
  case C.Value when P.Value then 0 else 1 end as Changed
from cte as C
  inner join cte as P
    on C.ProjectNumber = P.ProjectNumber and
       C.rn = P.rn + 1

-- Count the number of changes per project  
;with cte as
(
  select *,
    row_number() over(partition by ProjectNumber order by DateChanged) as rn
  from @T
)
select
  C.ProjectNumber,
  sum(case C.Value when P.Value then 0 else 1 end) as ChangeCount
from cte as C
  inner join cte as P
    on C.ProjectNumber = P.ProjectNumber and
       C.rn = P.rn + 1
group by C.ProjectNumber