Как получить группу row_number () на основе изменения значения столбца индикатора? - PullRequest
0 голосов
/ 13 января 2019

У меня есть столбцы TransactionTime, Amount и ResetCountInd (0/1).

Цель состоит в том, чтобы получить промежуточный итог столбца Amount от одной строки ResetCountInd = 0 до следующей.

Я понимаю, что если бы у меня был столбец PartitionNumber, начиная нумерацию, где ResetCountInd = 0, оставаясь постоянным до следующего, я мог бы легко выполнить промежуточный итог с помощью оконных функций.

Я не понимаю, как получить этот столбец PartitionNumber. Помощь

Визуализация того, что я после. Белый у меня есть, желтый у меня нет - PartitionNumber, в частности:

enter image description here

Пример создания данных SQL:

CREATE TABLE mytable(
   TransactionTime datetime NOT NULL PRIMARY KEY
  ,ResetCountInd   BIT  NOT NULL
  ,AddedAmount     INTEGER  NOT NULL
  ,PartitionNumber INTEGER  NOT NULL
  ,RunningTotal    INTEGER  NOT NULL
);
INSERT INTO mytable(TransactionTime,ResetCountInd,AddedAmount,PartitionNumber,RunningTotal) VALUES ('1/12/16 7:04 AM',0,0,1,0);
INSERT INTO mytable(TransactionTime,ResetCountInd,AddedAmount,PartitionNumber,RunningTotal) VALUES ('1/12/16 9:14 AM',1,50310,1,50310);
INSERT INTO mytable(TransactionTime,ResetCountInd,AddedAmount,PartitionNumber,RunningTotal) VALUES ('1/12/16 12:00 PM',1,276229,1,326539);
INSERT INTO mytable(TransactionTime,ResetCountInd,AddedAmount,PartitionNumber,RunningTotal) VALUES ('1/12/16 1:35 PM',1,45389,1,371928);
INSERT INTO mytable(TransactionTime,ResetCountInd,AddedAmount,PartitionNumber,RunningTotal) VALUES ('1/12/16 1:52 PM',0,0,2,0);
INSERT INTO mytable(TransactionTime,ResetCountInd,AddedAmount,PartitionNumber,RunningTotal) VALUES ('1/12/16 3:35 PM',1,108629,2,108629);
INSERT INTO mytable(TransactionTime,ResetCountInd,AddedAmount,PartitionNumber,RunningTotal) VALUES ('1/12/16 5:04 PM',1,19984,2,128613);
INSERT INTO mytable(TransactionTime,ResetCountInd,AddedAmount,PartitionNumber,RunningTotal) VALUES ('1/12/16 5:44 PM',1,69338,2,197951);
INSERT INTO mytable(TransactionTime,ResetCountInd,AddedAmount,PartitionNumber,RunningTotal) VALUES ('1/12/16 6:17 PM',1,126595,2,324546);
INSERT INTO mytable(TransactionTime,ResetCountInd,AddedAmount,PartitionNumber,RunningTotal) VALUES ('1/12/16 10:59 PM',1,33720,2,358266);
INSERT INTO mytable(TransactionTime,ResetCountInd,AddedAmount,PartitionNumber,RunningTotal) VALUES ('1/13/16 8:57 AM',1,45230,2,403496);
INSERT INTO mytable(TransactionTime,ResetCountInd,AddedAmount,PartitionNumber,RunningTotal) VALUES ('1/13/16 11:00 AM',0,0,3,0);
INSERT INTO mytable(TransactionTime,ResetCountInd,AddedAmount,PartitionNumber,RunningTotal) VALUES ('1/13/16 11:03 AM',1,155323,3,155323);
INSERT INTO mytable(TransactionTime,ResetCountInd,AddedAmount,PartitionNumber,RunningTotal) VALUES ('1/13/16 11:09 AM',0,0,4,0);
INSERT INTO mytable(TransactionTime,ResetCountInd,AddedAmount,PartitionNumber,RunningTotal) VALUES ('1/13/16 12:59 PM',1,67333,4,67333);

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Другое решение, возможно, не такое аккуратное, но работает.

SELECT 
    mytable.* 
    ,Partitions.*
    ,RunningTot                     = SUM(mytable.AddedAmount) OVER(PARTITION BY Partitions.PartitionNo ORDER BY mytable.TransactionTime) 

FROM mytable

    CROSS APPLY(SELECT TOP 1
                    PartitionNo                          = COUNT(*) OVER(ORDER BY Partition.ResetCountInd)  --Count admin units within the time window in the WHERE clause

                FROM mytable  AS Partition

                WHERE 
                    Partition.TransactionTime <= mytable.TransactionTime

                ) AS Partitions

Вот дБ <> скрипка демо

0 голосов
/ 13 января 2019

Номер группы - это кумулятивная сумма показателя, равная нулю. Вы можете вычислить это в подзапросе, а затем использовать его во внешнем запросе:

select t.*,
       sum(addedamount) over (partition by grp order by transactiontime) as runningtotal
from (select t.*,
             sum(case when resetcountind = 0 then 1 else 0 end) over (order by transactiontime) as grp
      from mytable t
     ) t
...