我想获取列值的计数,但要基于其他列值的条件。 例如:在数据下方,其中第一列是标识,第二列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
答案 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 <>小提琴。