Сброс промежуточного итога на основе значения в другом столбце для customerID - SQL Server - PullRequest
0 голосов
/ 19 декабря 2018

Я уже пытался найти здесь ответ на этот вопрос, и хотя я нашел похожие запросы, я не нашел этот точный.

Я ищу, чтобы подсчитать случаиклиент получает определенный балл, и если он получит меньше этого балла, я бы хотел, чтобы счет был сброшен.

Вот мои данные:

Data Before Running Total

И вот результат, который я хотел бы получить:

With Running Total

Буду признателен за любую помощь, а также объяснение любого используемого расширенного кода.

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018
DECLARE @T table (CustomerID int, Attempt int, score decimal(10,2) )
INSERT INTO @T
VALUES
(111, 1, 1)
,(111, 2, 1)
,(111, 3, 1)
,(111, 4, 0.5)
,(111, 5, 1)
,(111, 6, 0)
,(222, 5, 0.5)
,(222, 6, 1)
,(222, 7, 0.5)
,(222, 8, 1)
,(222, 9, 1)
,(222, 110, 1)
select t.*,
   (case when t.score < 1 then 0
         else row_number() over (partition by t.customerId, grp order by t.attempt)
    end) as ranking
from (select t.*,
         sum(case when score < 1.00 then 1 else 0 end) over (partition by t.customerId order by t.attempt) as grp
  from @t t
 ) t;
0 голосов
/ 19 декабря 2018

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

select t.*,
       (case when t.score < 1 then 0
             else row_number() over (partition by t.customerId, grp, score order by t.attempt)
        end) as ranking
from (select t.*,
             sum(case when score < 1 then 1 else 0 end) over (partition by t.customerId order by t.attempt) as grp
      from t
     ) t;

Здесь - это дБ <> скрипка.

...