2015-05-13 2 views
2

У меня есть один сценарий таблицы, в котором данные выглядят следующим образом.Ho, чтобы назначить предыдущее значение в столбце для каждой записи

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 поля для этого конкретного идентификатора запроса. то данные должны выглядеть так.

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 

Когда самая первая запись для идентификатора поля для конкретного запроса идентификатора придет то для него следует принимать нулевые значения в предыдущей ключевой столбец и текущий ключ остается тем же самым.

Когда вторая запись поступит для того же идентификатора поля, она должна принять предыдущее значение первой записи в предыдущем столбце ключа, а при поступлении третьей записи она должна взять предыдущее значение второй записи в предыдущем столбце и так далее.

Когда новый идентификатор поля пришел, то же самое нужно повторить снова.

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация. Очень нужна ваша помощь.

ответ

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 

В SQL 2012+ Вы можете использовать LAG или LEAD функции с пунктом OVER, чтобы получить предыдущую или следующую п-й строки значение:

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, как вы предполагаете в своем примере.

Есть ли у вас данные, которые можно использовать для правильной сортировки ваших записей? идентификатор запроса не хватает, потому что, даже если вы гарантировать, что он увеличивает монотонно для каждой операции, каждая операция может включать несколько значений для одной и той же пункт ид которые должны быть отсортированы по отношению друг к другу.

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 
Смежные вопросы