Ho为每条记录分配列中的Previous值

时间:2015-05-13 14:26:02

标签: sql-server-2008

我有一个表格场景,数据看起来像这样。

Request Id  Field Id    Current Key
1213         11          1001
1213         12          1002
1213         12          103
1214         13          799
1214         13          899
1214         13           7

在此循环开始第一个请求ID时,它应该检查该特定请求ID的所有字段ID。那么数据应该是这样的。

Request Id  Field Id    Previous Key  Current Key
1213         11          null            1001
1213         12         null             1002
1213         12         1002             103
1214         13         null             799
1214         13         799              899
1214         13         899               7

当特定请求id的字段id的第一个记录出现时,它应该在Previous键列中取空值,并且当前键将保持不变。

当第二个记录来自同一个字段ID时,它应该取前一个键列中第一个记录的先前值,当第三个记录到来时,它应该取上一列中第二个记录的先前值,依此类推。

当新的字段ID出现时,应该再次重复。

如果您需要更多信息,请告诉我。很需要您的帮助。

4 个答案:

答案 0 :(得分:0)

IN SQL 2008 您没有引导和延迟功能的好处。相反,您必须对新列进行查询。确保以相同的顺序查询两个表,并添加row_num列。然后选择最大的row_num,它不等于当前的row_num,并且具有相同的request_id和field_id。

select a.request_id,
       a.field_id,
       (select x.current_key
          from (select * from (select t.*, RowNumber() as row_num from your_table t) order by row_num desc) x
         where x.request_id = a.request_id
           and x.field_id = a.field_id
           and x.row_num < a.row_num
           and RowNumber()= 1
           ) as previous_key,
       a.current_key
  from (select t.*, RowNumber()as row_num from your_table t) a

IN SQL 2012 + 您可以将LAGLEAD函数与OVER子句一起使用,以获取上一行或下一行的第n行值:

select 
Request_Id, 
Field_Id,   
lag(Current_Key,1) over (partition by Request_ID, Field_ID) as Previous_Key  
,Current_Key
from your table

您应该看看如何订购结果。如果您有多个结果,则只会获取表格默认顺序中的下一行。如果您有其他要订购的列,例如日期时间,您可以执行以下操作:

lag(Current_Key,1) over (partition by Request_ID, Field_ID order by timestampColumn) 

答案 1 :(得分:0)

您可以查看此内容。

Declare @t table (Request_Id int,  Field_Id int, Current_Key int)

insert into @t values (1213, 11, 1001),(1213, 12, 1002), (1213, 12, 103) , (1214, 13, 799),  (1214, 13, 899), (1214, 13, 7)

;with cte
as (
select 0 rowno,0 Request_Id, 0 Field_Id, 0 Current_Key
union
select ROW_NUMBER() over(order by request_id) rowno, * from @t
)

select  
    t1.Request_Id , t1.Field_Id ,   
    case when t1.Request_Id = t2.Request_Id and t1.Field_Id = t2.Field_Id 
    then t2.Current_Key 
    else null
    end previous_key
    , t1.Current_Key 
    from cte t1, cte t2 
where t1.rowno = t2.rowno + 1 

Refer link when you want to compare row value

答案 2 :(得分:0)

  

当第二条记录来自相同的字段ID ...

表不能以这种方式工作:没有办法告诉1213,12,1002是1213,12,103的“上一个”记录,如您在示例中所假设的那样。

您是否有可用于正确排序记录的数据? 请求ID 是不够的,因为即使您保证每次操作都会单调递增,每个操作也可以包含同一 项的多个值id ,需要相互排序。

答案 3 :(得分:0)

试试这个,

 declare @tb table (RequestId int,FieldId int,  CurrentKey int)
    insert into @tb (RequestId,FieldId,CurrentKey) values
    (1213,11,1001),
    (1213,12,1002),
    (1213,12,103),
    (1214,13,799),
    (1214,13,899),
    (1214,13, 7)
    select RequestId,t.FieldId,
case when t.FieldId=t1.FieldId then t1.CurrentKey end as PreviousKey,t.CurrentKey from 
    (select *, ROW_NUMBER() over (order by RequestId,FieldId) as rno 
from @tb) t left join
    (select FieldId,CurrentKey, 
ROW_NUMBER() over (order by RequestId,FieldId) as rno from @tb) t1 on t.rno=t1.rno+1