2016-09-09 66 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 

基本上它需要通過交易日期(ASC),然後時間(ASC),然後順序進行排序(降序) - 我已經做到了。

我很努力地創建新的CurrentStatus列,該列將基於OldStatus/NewStatus列。如果在狀態變化行發生之前(New/Old不是-1的行),它使用第一個OldStatus。第一次狀態改變發生後,它後面的所有行(包括它本身)應該是狀態改變的NewStatus。在這種情況下,第2-4行應該是82,而第6-8行應該是3058.(這個數據縮寫爲一天內可能有多達50多筆交易,所以它必須在超過2行後工作狀態變化)

+0

「如果沒有非-1值」?醜陋和令人困惑的雙重否定。你的意思是「如果只有-1值」? ;) –

+0

你如何收到數據?一次一行?或一批行與您在示例中顯示的數據值一樣?我相信這裏的訣竅在於你如何進行INSERT。 –

+0

不幸的是,數據已經在表中。它作爲一個過夜批次進來。我只是在做數據報告。如果你看看這個例子,我真的想用最新的狀態替換所有的-1,這將是可愛的,有代碼糾正它,因爲它來。 – xenapan

回答

1

如果我正確理解你,如果以前排序的NewStatus不等於-1,你想使用OldStatus。如果它等於-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

。唯一的例外是在狀態改變發生之前發生的事務(當它改變時它的第一個舊狀態值) – xenapan

+0

我運行了兩套代碼,所有即時消息看到的是一個新的當前狀態列=新狀態(和行號碼) – xenapan

+0

你如何確定最近的狀態?您的分組邏輯似乎不適合基於您生成的行號的任何內容 – scsimon