2016-09-09 3 views
1

Итак, у нас есть таблица транзакций, и я пытаюсь добавить последний статус к транзакциям, но я в тупике о том, как иметь дело с несколькими изменениями состояния в течение дня. Вот пример счетамаркировка статуса для транзакций

CREATE TABLE Status 
([account] bigint, [TransactionDate] datetime, [TransactionTime] int, [Code] varchar(3), [TransactionSequence] int, [OldStatus] int, [NewStatus] int, [TransactionAmount] money); 

INSERT INTO Status 
([account], [TransactionDate], [TransactionTime], [Code], [TransactionSequence], [OldStatus], [NewStatus], [TransactionAmount]) 
VALUES 
(8246, '2015-11-02 00:00:00', 6615, 'RT', 3, -1, -1, -808.21), 
(8246, '2015-11-02 00:00:00', 6615, 'ITD', 2, 00047, 00082, NULL), 
(8246, '2015-11-02 00:00:00', 6615, 'PT', 1, -1, -1, 808.21), 
(8246, '2015-11-02 00:00:00', 6616, 'RT', 3, -1, -1, -808.21), 
(8246, '2015-11-02 00:00:00', 6616, 'ITR', 2, 00047, 03058, NULL), 
(8246, '2015-11-02 00:00:00', 6616, 'PT', 1, -1, -1, 808.21), 
(8246, '2015-11-05 00:00:00', 9600, 'E56', 2, -1, -1, '-121.94'); 

Вот как данные должны выглядеть

account  TransactionDate TransactionTime Code TransactionSequence  CurrentStatus TransactionAmount 
8246  2015-11-02  6615    RT  3     00047   -808.21 
8246  2015-11-02  6615    ITD  2     00082   NULL 
8246  2015-11-02  6615    PT  1     00082   808.21 
8246  2015-11-02  6616    RT  3     00082   -808.21 
8246  2015-11-02  6616    ITR  2     03058   NULL 
8246  2015-11-02  6616    PT  1     03058   808.21 
8246  2015-11-05  9600    E56  2     03058   -121.94 

В основном это должно быть отсортирован по дате сделки (по возрастанию), затем время (по возрастанию), то последовательность (по убыванию) - Я уже это сделал.

Я пытаюсь создать новый столбец CurrentStatus, который будет основываться на столбцах OldStatus/NewStatus. Если это произойдет до того, как произойдет изменение статуса (строка, где New/Old не равна -1), она использует первый OldStatus. После первого изменения статуса все строки, следующие за ним (включая себя), должны быть в статусе изменения NewStatus. В этом случае строки 2-4 должны быть 82, а строка 6-8 должна быть 3058. (Эти данные сокращены, так как в день может быть 50+ транзакций, поэтому она должна работать не более чем на 2 строки после a изменение статуса)

+0

«если нет значений, отличных от -1»? уродливый и запутанный двойной отрицательный. Вы имеете в виду «если есть только -1 значений»? ;) –

+0

как вы получаете данные? по одной строке за раз? или пакет строк, как со значениями данных, которые вы показываете в своем примере? Я считаю, что трюк здесь в том, как вы сделали бы INSERT. –

+0

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

ответ

1

Если я правильно вас понимаю, вы хотите использовать OldStatus, если предыдущий отсортированный NewStatus не равен -1. Если он равен -1, то используйте текущие строки NewStatus. Вот один из способов добиться этого.

;with cteRowNum as(
select 
    *, 
    Rank() OVER (order by TransactionDate asc, TransactionTime asc, TransactionSequence desc) as RowNumber 
from Status) 

select 
    c.account, 
    c.TransactionDate, 
    c.TransactionTime, 
    c.Code, 
    c.TransactionSequence, 
    c.OldStatus, 
    c.NewStatus, 
    c.TransactionAmount, 
    c.RowNumber, 
    case 
     when c.NewStatus = -1 and c.RowNumber = 1 then lead(c.oldstatus) over(order by c.RowNumber) 
     when c.NewStatus = -1 then Lag(c.NewStatus,c.RowNumber - (select max(RowNumber) from cteRowNum where RowNumber < c.RowNumber and NewStatus <> -1)) over (order by c.RowNumber) 
     else c.NewStatus 
    end as CurrentStatus 
from 
    cteRowNum c 
+0

, если вы посмотрите на пример, я действительно хочу заменить все -1 самым последним статусом. единственное исключение - это транзакции, которые происходят до того, как произойдет изменение статуса (тогда это первое старое значение статуса при его изменении). – xenapan

+0

. Я запустил оба набора кода, и все im im - это новый текущий столбец состояния, который = новый статус (и строка номер) – xenapan

+0

как вы определяете самый последний статус? ваша логика группировки, похоже, не соответствует ни одному – scsimon

Смежные вопросы