如何基于在SQL查询中将其重置的列值获取计数

时间:2019-05-06 16:18:43

标签: sql sql-server

我想获取列值的计数,但要基于其他列值的条件。 例如:在数据下方,其中第一列是标识,第二列statusId,第三列重复custId,第四列状态。

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的行进行计数,并将状态S重置为0,并且状态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 个答案:

答案 0 :(得分:2)

这回答了问题的原始版本。

您可以使用累积总和来定义组,然后使用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;

Here是db <>小提琴。