所以我们有一个交易表,我试图将最新的状态附加到交易中,但我很难知道如何在一天内处理多个状态变化。这是一个示例帐户
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行状态变化)
答案 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