Как получить количество на основе значения столбца, который сбрасывает его в запросе SQL - PullRequest
1 голос
/ 06 мая 2019

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

id          statusId         CustId      status  

1           1           100         E  
2           1           100         E  
3           1           100         E  
4           2           100         S  
5           1           100         E  
6           1           100         E  
7           2           100         S  
8           1           200         E  
9           1           200         E  
10          2           200         S  
11          2           200         S  
12          1           200         E  
13          2           200         S  

У меня есть функция used Row_Number(), но это не помогло ее достичь.

select case when Status = 'S' then 0
    when Status = 'E' then sum(case when Status = 'E' then 1 else 0 end) over (order by Id asc) end  as cnt
from cust

Ожидаемый результат: Я хочу получить результат в следующем формате, используя запрос выбора (не любой цикл).

CusId   ExpectedCount  
100     2              -- there are two rows with status E before last S
200     1              -- There is one row with status E before last S 

Чтобы достичь вышеуказанного результата, я считаю строку, имеющую статус E, и сбрасываю ее обратно в 0 для статуса S, а итоговый счет статуса E должен быть возвращен до последнего состояния S.

Фактический результат: я получаю счет значения состояния «E», и счет не сбрасывается, счет продолжает работать.Пример:

custId Id Status ExpectedCount
100    1  E      1
100    2  E      2
100    3  E      3
100    4  S      0
100    5  E      4
100    6  E      5
100    7  E      6

1 Ответ

2 голосов
/ 06 мая 2019

ЭТО ОТВЕТЫ НА ОРИГИНАЛЬНУЮ ВЕРСИЮ ВОПРОСА.

Вы можете использовать совокупную сумму, чтобы определить группы, а затем использовать row_number():

select custid, id, status,
       (case when status = 'S' then 0
             else row_number() over (partition by custid, grp, status order by id)
        end) as expectedcount
from (select t.*,
             sum(case when status = 'S' then 1 else 0 end) over (partition by custid order by id) as grp
      from t
     ) t;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...