Число попыток превышения временных состояний в T-SQL

Solengol спросил: 14 ноября 2017 в 05:23 в: sql-server

У меня есть таблица, которая выглядит следующим образом (без столбца попытки):

Account      Status        Date         Attempt(*)

A            In_PROGRESS   12/12/2017   1
A            ERROR         13/12/2017   1
A            SUCCESS       15/12/2017   2
B            ERROR         10/12/2017   1
B            SUCCESS       13/12/2017   2
C            IN_PROGRESS   11/12/2017   1
C            ERROR         13/12/2017   1
C            ERROR         14/12/2017   2
C            IN_PROGRESS   15/12/2017   3

Я хочу получить столбец попытки (*). Состояния ERROR и SUCCESS являются конечными состояниями. Например, для учетной записи C мы имеем, что первая попытка вызвала ОШИБКУ, вторая попытка вызвала ОШИБКУ, а третья попытка - IN_PROGRESS.

Я знаю, что один RANK () не будет работать из-за переходные статусы IN_PROGRESS. Например, если бы я должен был пойти:

RANK () OVER (PARTITION BY ORDER BY Date Date ASC)

я бы получил:

Account      Status        Date         Attempt(*)

A            In_PROGRESS   12/12/2017   1
A            ERROR         13/12/2017   2
A            SUCCESS       15/12/2017   3
B            ERROR         10/12/2017   1
B            SUCCESS       13/12/2017   2
C            IN_PROGRESS   11/12/2017   1
C            ERROR         13/12/2017   2
C            ERROR         14/12/2017   3
C            IN_PROGRESS   15/12/2017   4

Который не учитывает переходные статусы. Я бы использовал результат во второй таблице для создания нового столбца, чтобы получить желаемый результат, код sudo будет выглядеть примерно так:

New_Attempt [n] = if Attempt (*) = 1, затем 1 else (если попытка (*) > 1 и статус [n-1] в (ОШИБКА, УСПЕХ), то попытка [n-1] + 1 еще попытка [n-1])

где 'n' это номер строки.

Я относительно новичок в SQL, я исследовал другие функции ранжирования, такие как NTILE и DENSE_RANK, но я все еще не могу найти способ сделать это.

PS Я использую T-SQL в SQL Server Management Studio 2008

Спасибо! :) Р>


0 ответов