交易的状态标签

时间:2016-09-09 20:28:39

标签: sql-server

所以我们有一个交易表,我试图将最新的状态附加到交易中,但我很难知道如何在一天内处理多个状态变化。这是一个示例帐户

network.host: 0.0.0.0

以下是数据的外观

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');

基本上它需要按交易日期(asc)排序,然后按时间(asc)排序,然后按顺序排序(降序) - 我已经完成了这项工作。

我正在努力创建基于OldStatus / NewStatus列的新CurrentStatus列。如果它发生在状态更改行发生之前(New / Old不是-1的行),它将使用第一个OldStatus。在第一次状态更改发生后,其后面的所有行(包括其自身)都应该是状态更改的NewStatus。在这种情况下,行2-4应该是82,行6-8应该是3058.(这个数据缩写为一天可以有多达50多个事务,所以它必须工作超过仅仅2行状态变化)

1 个答案:

答案 0 :(得分: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