2015-05-13 53 views
2

我有哪些數據是這樣的一個表的情況。何分配中列前值爲每個記錄

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

在此循環從第一個請求標識開始時,它應該檢查該特定請求標識的所有字段標識。那麼數據應該看起來像這樣。

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第一個記錄來則應該取空值在上一頁鍵列,且當前按鍵將保持不變。

當第二記錄將前來同場ID其應採取的第一個記錄的前值在上一個鍵列,當第三個記錄都應該採取第二個記錄的前值在以前的專欄等等。

當新的領域ID傳來了同樣的事情,應再次重複。

請讓我知道如果你需要更多的info.Much需要你的幫助。

回答

0

IN SQL 2008 您沒有領先和滯後功能的好處。相反,您必須對新列進行查詢。確保你以相同的順序查詢兩個表,並添加一個row_num列。然後選擇不等於當前ROW_NUM並且具有相同的REQUEST_ID和FIELD_ID最大ROW_NUM。

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 

在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

滯後,鉛是SQL 2012 onwords,他希望在2008年 – Ajay2707

+0

版本@ Ajay2707感謝注意到,。我已經更新了答案。使我非常欣賞分析功能和窗口。 – Brino

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

0

當第二記錄將前來同場ID ...

表不工作是這樣的:有沒有辦法告訴大家,1213,在你的例子中,12,1002是1213,12,103的「前」記錄。

您是否有任何數據可以用於正確排序記錄? 請求ID是不夠的,因爲,即使你保證它單調遞增每個操作,每個操作可以包括對同一項目ID這就需要相互進行排序多個值。

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 
相關問題